我在android上工作,遇到了一个问题,我不能在我的DataHandler类中初始化sqlite实例,但是我可以在我的MainActivity类中初始化它。
示例: 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); //...在数据处理程序类中:
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
发布于 2018-01-03 05:12:27
最好的方法是使用Singleton模式,如本文所述,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();这种方法非常适合于从您的应用程序的不同位置访问数据库,如服务、片段等。
发布于 2017-05-08 02:46:18
这样做对吗?
当项目运行时,它会抛出错误吗?
这就是我通常在DatabaseHandler中所做的(只是分享)
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;在DatabaseHandler方法中,初始化onCreate
db = new DatabaseHandler(this);当您想使用SQLite数据库时,请确保您有以下行
SQLiteDatabase db = this.getWritableDatabase();https://stackoverflow.com/questions/43838827
复制相似问题