这是在MainActivity中初始化SQLite的正确方法吗?
我在android studio上工作,我遇到了一个问题,我不能初始化我的DataHandler类中的我的sqlite实例,但我可以在我的MainActivity类中初始化它。这是在MainActivity中初始化SQLite的正确方法吗?
实施例: MainActivity类别:
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;
//valid
private SQLiteDatabase sqLiteDatabase = openOrCreateDatabase("Database", Context.MODE_PRIVATE , null); //...
中的DataHandler类
:
public class DataHandler {
public static String[] names,dates;
//invalid: cannot resolve method
SQLiteDatabase sqLiteDatabase = openOrCreateDatabase("HMDB", Context.MODE_PRIVATE , null);
所以,我没有在主活动此
:
public SQLiteDatabase getSqLiteDatabase() {
return sqLiteDatabase;
}
在数据处理程序中:
MainActivity mainActivity;
SQLiteDatabase sqLiteDatabase = mainActivity.getSqLiteDatabase();
这是正确的方法吗?有没有更好的方法? sry如果难以理解
最好的方法是使用Singleton模式如下描述 https://github.com/codepath/android_guides/wiki/Local-Databases-with-SQLiteOpenHelper
public class PostsDatabaseHelper extends SQLiteOpenHelper {
private static PostsDatabaseHelper sInstance;
// ...
public static synchronized PostsDatabaseHelper getInstance(Context context) {
// Use the application context, which will ensure that you
// don't accidentally leak an Activity's context.
if (sInstance == null) {
sInstance = new PostsDatabaseHelper(context.getApplicationContext());
}
return sInstance;
}
/**
* Constructor should be private to prevent direct instantiation.
* Make a call to the static method "getInstance()" instead.
*/
private PostsDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
而在你MainActivity
使用它就像
// In any activity just pass the context and use the singleton method
PostsDatabaseHelper helper = PostsDatabaseHelper.getInstance(this);
// or
PostsDatabaseHelper helper = PostsDatabaseHelper.getInstance(context);
// or
PostsDatabaseHelper helper = PostsDatabaseHelper.getInstance(getActivity());
// Do something with data via Cursor and
helper.close();
这种方法完美的适合从不同的地方访问数据库,如服务,碎片等...
这是正确的方法吗?
项目运行时是否引发任何错误?
这是我常在数据库处理器(只是共享)
public class DatabaseHandler extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "DATA.db";
public static final String TABLE_NAME = "TITLE";
public static final String COL0 = "ID";
public static final String COL1 = "TODO";
public static final String COL2 = "DETAIL";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, TODO TEXT, DETAIL TEXT)";
db.execSQL(createTable); }
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop if database is exists" + TABLE_NAME);
onCreate(db);
}
}
做MainActivity,声明此行
DatabaseHandler db;
在onCreate
方法,初始化数据库处理器
db = new DatabaseHandler(this);
当你想使用SQLite
数据库,请确保您有这条线
SQLiteDatabase db = this.getWritableDatabase();
感谢它的工作 –
ca我使用我的方式从mainactivity获取文件 –
你是什么文件意思? –
不,这不是最好的方式来做到这一点。很难说出什么问题,但第一个猜测是你不在'DataHandler'类中导入'SQLiteDatabase'。但是,为此使用'SQLiteOpenHelper'更为常见。 – Gary99
我想在这里你可以获取更多信息https://github.com/codepath/android_guides/wiki/Local-Databases-with-SQLiteOpenHelper –