在非Activity类中访问数据库

sve*_*ija 5 sqlite android

我有一些类(SomeClass.class).我想在其中有一些静态方法,如getAllDatabaseItems,getTableItems,insertNewRecord等.

如果我这样做的话

SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);
Run Code Online (Sandbox Code Playgroud)
  • 我需要扩展Activity(但仍然不能在静态方法中使用它)或在每个单独的方法(来自"调用者活动")中传递"db"变量,这是非常笨重的.

什么是解决方案,所以我可以从一些类调用SomeClass.getAllDatabaseItems()

@ MobileDev123所以我仍然需要扩展Activity(因为openOrCreateDatabase方法)?如果我有这个类(实际上不是一个活动,我不会那样使用它)

public class Partner extends Activity {
@SuppressWarnings("static-access")
public Partner(Context mContext) {
    myContext = mContext;
    db = openOrCreateDatabase(DATABASE_NAME, myContext.MODE_PRIVATE, null);

    db.execSQL("CREATE TABLE IF NOT EXISTS " + PARTNER_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " VARCHAR);");
    db.execSQL("CREATE TABLE IF NOT EXISTS " + ADDRESS_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " + PARTNER_ID + " INT, " + ADDRESS + " VARCHAR, " + CITY + " VARCHAR);");
}
Run Code Online (Sandbox Code Playgroud)

然后从我的一些活动中调用它

    Partner newPartner = new Partner(this);
    partnersItems = newPartner.getAllItems();
Run Code Online (Sandbox Code Playgroud)

我在第4行得到NullExceptionError(Partner.class) - 为什么?如果我使用静态参考

MODE_PRIVATE => (Context.MODE_PRIVATE)
Run Code Online (Sandbox Code Playgroud)

再次它不起作用.

@Falmarri与static相同,如果我传入"this"参数(来自某个调用者类)并在静态方法中将其作为Context参数接收仍然无法成功创建/打开我的数据库(请参阅前面的行)

Pra*_*ham 4

必须有一项活动或服务调用您的班级,您所能做的就是this在您方便的时间通过。(我更喜欢在构造函数中传递它)。

在接收手时使用上下文即时。

例如,MyActivity您可以在类中调用createDatabase(this)ornew DataServices(this)但在DataServices类中参数类型必须context而不是MyActivity

现在您有了上下文参数,您可以按照您想要的方式使用它,包括调用openOrCreateDatabase().

编辑:添加代码

来自Main.java

DataBase database = new DataBase(this); //This will pass an instance of main. Which is eventually the subclass of Context.java
Run Code Online (Sandbox Code Playgroud)

在 DataBase 类中:您不需要在那里扩展活动。在构造函数定义中

public DataBase(Context context); //如果您使用 eclipse 并依赖一些自动化工具,您可以看到类似 Main main 的内容。但是使用这些行,这样您就可以通过传递它从任何活动或服务中调用它。

定义 Context 类的一个字段,并将其引用到 context arg。

喜欢this.localContext= context;

通过使用 localContext 变量,您可以调用 openOrCreateDataBase 列。

添加:如果您有任何附加到此的控件(视图的子类),您可以通过调用实例化DataBasenew DataBase(view.getContext());

我希望这会对您有所帮助......如果需要更多帮助,请随时在下面发表评论。