下面是一些示例代码,说明了三种可能的方法。这些将允许在整个应用程序中访问数据库。
方法 #1:让 `SQLiteOpenHelper` 成为静态数据成员
这不是完整的实现,但它应该让您了解如何DatabaseHelper
正确设计类。静态工厂方法确保任何时候都只存在一个 DatabaseHelper 实例。
/**
* create custom DatabaseHelper class that extends SQLiteOpenHelper
*/
public class DatabaseHelper extends SQLiteOpenHelper {
private static DatabaseHelper mInstance = null;
private static final String DATABASE_NAME = "databaseName";
private static final String DATABASE_TABLE = "tableName";
private static final int DATABASE_VERSION = 1;
private Context mCxt;
public static DatabaseHelper getInstance(Context ctx) {
/**
* use the application context as suggested by CommonsWare.
* this will ensure that you dont accidentally leak an Activitys
* context (see this article for more information:
* http://android-developers.blogspot.nl/2009/01/avoiding-memory-leaks.html)
*/
if (mInstance == null) {
mInstance = new DatabaseHelper(ctx.getApplicationContext());
}
return mInstance;
}
/**
* constructor should be private to prevent direct instantiation.
* make call to static factory method "getInstance()" instead.
*/
private DatabaseHelper(Context ctx) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.mCtx = ctx;
}
}
方法 #2:使用 `ContentProvider` 抽象 SQLite 数据库
这是我建议的方法。一方面,新CursorLoader
类需要ContentProvider
s,因此如果您希望 Activity 或 FragmentLoaderManager.LoaderCallbacks<Cursor>
使用 a实现CursorLoader
(我建议您利用它,它很神奇!),您需要ContentProvider
为您的应用程序实现 a。此外,您无需担心使用 ContentProviders 创建 Singleton 数据库助手。只需getContentResolver()
从 Activity 调用,系统就会为您处理所有事情(换句话说,无需设计单例模式来防止创建多个实例)。
希望这可以帮助!