在非Activity类中访问数据库

时间:2010-12-30 00:52:47

标签: android sqlite

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

如果我这样做的话

SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);
  • 我需要扩展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);");
}

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

    Partner newPartner = new Partner(this);
    partnersItems = newPartner.getAllItems();

我在第4行(Partner.class)得到一个NullException错误 - 为什么?如果我在

上使用静态参考
MODE_PRIVATE => (Context.MODE_PRIVATE)

再次它不起作用。

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

4 个答案:

答案 0 :(得分:4)

必须有一个叫您课程的活动或服务,您可以做的就是在方便的时候通过this。 (我更喜欢在构造函数中传递它)。

接收手时使用上下文瞬间。

例如,从MyActivity班级,您可以拨打createDatabase(this)new DataServices(this),但在DataServices班级中,参数类型必须为context而不是MyActivity

现在你有了context参数,你可以按照你想要的方式使用它,包括调用openOrCreateDatabase()

修改:添加代码

来自Main.java的

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

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

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

定义Context类的字段,并将其引用到上下文arg。

this.localContext= context;

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

ADDITION :如果你有任何控件(视图的子类),你可以通过调用new DataBase(view.getContext());实例化数据库

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

答案 1 :(得分:0)

我不确定是否可以直接这样做。我自己也在努力解决这个问题,但是每个应用程序都使用不同的数据库句柄,因此当你从中获取句柄时,Android需要知道如何抓取它(一个Context):

SQLiteDatabase db = (SQLiteDatabase)(new SQLOpenHelperDerivedClass(this)).getReadableDatabase();

也许你可以弄清楚如何绕过SQLOpenHelper并使用硬编码的数据库路径。 SQLOpenHelper可能会为您提供一大堆有用的东西,但是你会放弃它们。我想这可能是跨设备的关键。

答案 2 :(得分:0)

您需要一个上下文。如果要在静态方法中执行此操作,则必须接受上下文

答案 3 :(得分:0)

您不需要上下文。使用SQLiteDatabase静态方法:

public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler)
public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)
public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)

或:


public static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler)
public static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags)