我有一些课( SomeClass.class )。我想在其中有一些静态方法,如 getAllDatabaseItems ,getTableItems,insertNewRecord等。
如果我这样做的话
SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);
什么是解决方案,所以我可以从一些类调用 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参数接收它仍然无法成功创建/打开我的数据库(见前面的行)
答案 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)