“InitDatabase()”被称为“inserRecord()”,但它每次都显示异常,并且在 insertRecord()中我也有称为 closeDatabase(),其中我有代码来关闭DB(数据库)。
在程序启动时,我使用 insertRecord()输入记录,但是在运行时,当我用来插入记录时,它会返回新的行ID但是当我select * from table
时它不会显示最后插入的记录
如果在该应用程序中需要,可以进一步将光标存储在hashmap中。
public SQLiteDatabase initDatabase(){
Log.v("XIG","creating or opening database.");
db_helper= new DatabaseHelper(context,dbname,1);
DB = context.openOrCreateDatabase(dbname,SQLiteDatabase.CREATE_IF_NECESSARY, null);
DB.setVersion(1);
DB.setLocale(Locale.getDefault());
DB.setLockingEnabled(true);
DB = db_helper.getWritableDatabase();
return DB;
}
public void insertRecord(String Table,String columnId[],String value[],String typeOfValue[]){
initDatabase();
Log.v("XIG","creating new record.");
ContentValues new_record = new ContentValues();
for(int i=0; i<columnId.length; i++){
if(typeOfValue[i].equals("INT")){
new_record.put(columnId[i],Integer.parseInt(value[i]));
}
else{
new_record.put(columnId[i],value[i]);
}
}
long rowid;
try{
DB.beginTransaction();
rowid = DB.insert(Table,null,new_record);
DB.setTransactionSuccessful();
}
finally{
DB.endTransaction();
}
Log.v("XIG","inserted rowid in "+Table+": "+rowid);
closeDatabase();
}
initDatabase() method shows exception :
07-12 13:15:32.415: E/SQLiteDatabase(13643): close() was never explicitly called on database '/data/data/com.app/databases/mydb3'
07-12 13:15:32.415: E/SQLiteDatabase(13643): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
答案 0 :(得分:1)
DB.setTransactionSuccessful();
之后你必须使用 DB.commit(); 提交它,然后肯定会有效。
您可以使用以下代码将光标数据存储到MashMap列表中
public ArrayList<HashMap<String, String>> select(
String tableName, String[] fields,
String[] selectionArgs) {
Cursor cursor = // get data by firing query
cursor.moveToFirst();
ArrayList<HashMap<String, String>> mapList = new ArrayList<HashMap<String,String>>();
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
HashMap<String, String> map = new HashMap<String, String>();
for (int j = 0; j < fields.length; j++) {
map.put(fields[j], cursor.getString(j));
}
mapList.add(map);
}
return mapList;
}
如果有效,请接受此答案。
答案 1 :(得分:0)
问题可能不在此功能中。你的程序在某个地方打开了数据库,并且在调用这个函数之前没有关闭它,它试图“打开”已经打开的数据库..
正如您的错误日志所示
Application did not close the cursor or database object that was opened here
答案 2 :(得分:0)
关闭应该在finally块内。如果有例外则不会发生。
答案 3 :(得分:0)
不要尝试在每次更新时打开和关闭数据库。
在应用程序启动时打开数据库一次,并且不要打扰关闭它。在整个过程中重用单个数据库连接;你的代码就这么简单了,你也不会丢失任何东西。