在我的数据库中有许多方法,每个方法都是通过将ID作为参数传递来检索特定行的。而且,在我的应用程序中,我需要调用这些方法对检索到的数据执行某些操作。例如,下面发布的代码。在调用这些方法之前,是否需要检查SqliteDB.isOpen
。
Java_Code:
if (! sqliteDB.isOpen()) {
Log.d(TAG, "@fetchItemRelativeToFullList(): Sqlite DataBase Was Closed, and it Will Be Opened");
sqliteDB = mplOpenHelperDB.getWritableDatabase();
}
Log.d(TAG, "@fetchItemRelativeToFullList(): Sqlite DataBase Is Opened");
String name = mplOpenHelperDB.getLocationName(itemClickedPos+1);
Toast.makeText(getApplicationContext(), "name of location"+name, Toast.LENGTH_SHORT).show();
DataBaseRow dataBaseRow = new DataBaseRow();
if (dataBaseRow != null) {
Log.d(TAG, "@fetchItemRelativeToFullList(): Object of DataBaseRow Class Is Created, Not NULL");
if ( (mplOpenHelperDB.getLocationName(itemClickedPos+1)).equals("") ) {
Log.i(TAG, "@fetchItemRelativeToFullList: getLocationName Is Empty");
dataBaseRow.setLocName("NULL");
}
else {
String targetName = mplOpenHelperDB.getLocationName(itemClickedPos+1);
dataBaseRow.setLocName(targetName);
}
数据库方法示例:
public String getLocationName(long id) {
SQLiteDatabase db = this.getReadableDatabase();
SQLiteCursor c = (SQLiteCursor) db.rawQuery("SELECT locationName FROM MPLData WHERE "+
BaseColumns._ID+" = "+
Long.toString(id) +" AND locationName IS NOT NULL ", null);
String r;
c.moveToFirst();
if (c.getCount() == 0) {
return "";
} else {
r = c.getString(0);
}
c.close();
db.close();
return r;
}
答案 0 :(得分:1)
您当前问题的答案是"否"。当getReadableDatabase()时,db已打开。你很好。
FWIW,我猜你有在其他一些环境(Ruby,PHP等)中进行数据库工作的经验。正如大卫所指出的那样,你做的工作比你需要做的还多。看一下Loaders,ContentProviders和ContentResolvers,FTW。
答案 1 :(得分:1)
否,getReadableDatabase()
和getWritableDatabase()
创建和/或打开将用于读写的数据库。第一次调用此数据库时,将打开数据库并调用onCreate(SQLiteDatabase)
,onUpgrade(SQLiteDatabase, int, int)
和/或onOpen(SQLiteDatabase)
。