没有数据库的锁!在android系统 [英] Don't have database lock! in android
问题描述
我最近收到这个错误我知道原因,但我不知道如何解决它。
下面是从logcat的错误:
2月10日至五日:34:00.177:E / SQLiteDatabase(1111):关闭()从未被明确要求在数据库'/data/data/standard.internet.marketing.mymovingfriend /数据库/ mymovingfriend
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):android.database.sqlite.DatabaseObjectNotClosedException:应用程序没有关闭在这里打开游标或数据库对象
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.database.sqlite.SQLiteDatabase<&初始化GT;(SQLiteDatabase.java:1943)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1051)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:770)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在standard.internet.marketing.mymovingfriend.SQLHandler.open(SQLHandler.java:178)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在standard.internet.marketing.mymovingfriend.ListMovingNames $ 1.onClick(ListMovingNames.java:71)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.view.View.performClick(View.java:3511)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.view.View $ PerformClick.run(View.java:14105)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.os.Handler.handleCallback(Handler.java:605)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.os.Handler.dispatchMessage(Handler.java:92)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.os.Looper.loop(Looper.java:137)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在android.app.ActivityThread.main(ActivityThread.java:4424)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在java.lang.reflect.Method.invokeNative(本机方法)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在java.lang.reflect.Method.invoke(Method.java:511)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
2月10日至5日:34:00.177:E / SQLiteDatabase(1111):在dalvik.system.NativeStart.main(本机方法)
2月10日至5日:34:00.216:E /系统(1111):未捕获的异常被抛出终结
2月10日至5日:34:00.226:E /系统(1111):java.lang.IllegalStateException:不必数据库锁定!
2月10日至5日:34:00.226:E /系统(1111):在android.database.sqlite.SQLiteDatabase.verifyLockOwner(SQLiteDatabase.java:2090)
2月10日至5日:34:00.226:E /系统(1111):在android.database.sqlite.SQLiteDatabase $ 1.entryRemoved(SQLiteDatabase.java:2182)
2月10日至5日:34:00.226:E /系统(1111):在android.database.sqlite.SQLiteDatabase $ 1.entryRemoved(SQLiteDatabase.java:2178)
2月10日至5日:34:00.226:E /系统(1111):在android.util.LruCache.trimToSize(LruCache.java:197)
2月10日至5日:34:00.226:E /系统(1111):在android.util.LruCache.evictAll(LruCache.java:285)
2月10日至5日:34:00.226:E /系统(1111):在android.database.sqlite.SQLiteDatabase.deallocCachedSqlStatements(SQLiteDatabase.java:2143)
2月10日至5日:34:00.226:E /系统(1111):在android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1126)
2月10日至5日:34:00.226:E /系统(1111):在android.database.sqlite.SQLiteDatabase.finalize(SQLiteDatabase.java:1914)
2月10日至5日:34:00.226:E /系统(1111):在java.lang.Daemons $ FinalizerDaemon.doFinalize(Daemons.java:182)
2月10日至5日:34:00.226:E /系统(1111):在java.lang.Daemons $ FinalizerDaemon.run(Daemons.java:168)
2月10日至5日:34:00.226:E /系统(1111):在java.lang.Thread.run(Thread.java:856)
这里是code的活性
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
// TODO自动生成方法存根
super.onCreate(savedInstanceState);
的setContentView(R.layout.selectorcreatemove); allFunctions();
} 私人无效allFunctions(){
addMove =(按钮)findViewById(R.id.bAddMove);
etAddMove =(EditText上)findViewById(R.id.etMoveName); MoveList =(ListView控件)findViewById(R.id.lvMoveItems);
SQLHandlerview =新SQLHandler(本); SQLHandlerview =新SQLHandler(ListMovingNames.this);
SQLHandlerview.open(); 光标= SQLHandlerview.getMove();
startManagingCursor(光标); 的String [] =由新的String [] {} SQLHandler.KEY_MOVENAME;
INT []为= INT新[] {} R.id.text; SimpleCursorAdapter的CursorAdapter =新SimpleCursorAdapter(这一点,R.layout.row,光标,从,到);
MoveList.setAdapter(CursorAdapter的);
SQLHandlerview.close(); addMove.setOnClickListener(新OnClickListener(){ @燮pressLint(NewApi)
公共无效的onClick(视图v){
// TODO自动生成方法存根
。字符串ssmoveName = etAddMove.getText()的toString();
INT X = ssmoveName.length() - 1;
如果(ssmoveName.isEmpty()|| Character.isWhitespace(ssmoveName.charAt(0))|| Character.isWhitespace(ssmoveName.charAt(X))){
Toast.makeText(ListMovingNames.this,
请输入一个有效的名字!避免在名称的开头或结尾给出一个空白的名称或空白,
Toast.LENGTH_LONG).show();
}其他{
尝试{
SQLHandler检查=新SQLHandler(ListMovingNames.this);
check.open();
串舍克= check.checkMove(ssmoveName);
check.close();
如果(scheck.equals(ssmoveName)){
Toast.makeText(ListMovingNames.this,移动名称已经存在,请给出一个不同的名字,Toast.LENGTH_LONG).show();
}其他{
SQLHandler进入=新SQLHandler(ListMovingNames.this);
entry.open();
entry.createMove(ssmoveName);
entry.setTodo(ssmoveName);
Toast.makeText(ListMovingNames.this,好,Toast.LENGTH_SHORT).show();
entry.close();
意图I =新意图(getApplicationContext(),StartMoving.class);
i.putExtra(moveName,ssmoveName);
startActivity(ⅰ);
}
}赶上(例外五){
// TODO自动生成catch块
SQLHandler进入=新SQLHandler(ListMovingNames.this);
entry.open();
entry.createMove(ssmoveName);
entry.setTodo(ssmoveName);
entry.close();
意图I =新意图(getApplicationContext(),StartMoving.class);
i.putExtra(moveName,ssmoveName);
startActivity(ⅰ);
}
}
}
}); MoveList.setOnItemClickListener(新OnItemClickListener(){ 公共无效onItemClick(适配器视图<>为arg0,最终意见认为,INT位置,
长ID){
// TODO自动生成方法存根
此举=((TextView的)视图).getText()的toString()。
意图I =新意图(getApplicationContext(),StartMoving.class);
i.putExtra(moveName,移动);
startActivity(ⅰ);
}
}); }
}
每出现此行code被称为错误的时间。 entry.setTodo(ssmoveName);
这个方法调用这是从我的数据库处理程序。
众长setTodo(字符串smovename){
ContentValues CV =新ContentValues();
cv.put(KEY_TODOMOVE,smovename);
cv.put(KEY_CB1,未完成);
cv.put(KEY_CB2,未完成);
cv.put(KEY_CB3,未完成);
cv.put(KEY_CB4,未完成);
cv.put(KEY_CB5,未完成);
cv.put(KEY_CB6,未完成);
cv.put(KEY_CB7,未完成);
cv.put(KEY_CB8,未完成);
cv.put(KEY_CB9,未完成);
cv.put(KEY_CB10,未完成);
cv.put(KEY_CB11,未完成);
cv.put(KEY_CB12,未完成);
cv.put(KEY_CB13,未完成);
cv.put(KEY_CB14,未完成);
cv.put(KEY_CB15,未完成);
cv.put(KEY_CB16,未完成);
cv.put(KEY_CB17,未完成);
cv.put(KEY_CB18,未完成);
cv.put(KEY_CB19,未完成);
cv.put(KEY_CB20,未完成);
cv.put(KEY_CB21,未完成);
cv.put(KEY_CB22,未完成);
cv.put(KEY_CB23,未完成);
cv.put(KEY_CB24,未完成);
cv.put(KEY_CB25,未完成);
cv.put(KEY_CB26,未完成);
cv.put(KEY_CB27,未完成);
cv.put(KEY_CB28,未完成);
cv.put(KEY_CB29,未完成);
cv.put(KEY_CB30,未完成);
cv.put(KEY_CB31,未完成);
cv.put(KEY_CB32,未完成);
cv.put(KEY_CB33,未完成);
cv.put(KEY_CB34,未完成);
cv.put(KEY_CB35,未完成);
cv.put(KEY_CB36,未完成);
cv.put(KEY_CB37,未完成);
cv.put(KEY_CB38,未完成);
返回ourDatabase.insert(DATABASE_TABLE4,空,CV);
}
这里是我的数据库处理程序呢。
公共类SQLHandler {
公共静态最后弦乐KEY_ROOMMOVEHOLDER =roommoveholder;
公共静态最后弦乐KEY_ROOM =房间;
公共静态最后弦乐KEY_ROOMWEIGHT =roomweight; 公共静态最后弦乐KEY_ITEMMOVEHOLDER =itemmoveholder;
公共静态最后弦乐KEY_ITEMNAME =ITEMNAME;
公共静态最后弦乐KEY_ITEMVALUE =itemvalue;
公共静态最后弦乐KEY_ROOMHOLDER =roomholder;
公共静态最后弦乐KEY_ITEMWEIGHT =itemweight; 公共静态最后弦乐KEY_MOVENAME =movename;
公共静态最后弦乐KEY_ID1 =_id;
公共静态最后弦乐KEY_ID2 =_id;
公共静态最后弦乐KEY_ID3 =_id;
公共静态最后弦乐KEY_ID4 =_id;
公共静态最后弦乐KEY_MOVEDATE =在MOVEDATE;
公共静态最后弦乐KEY_TOTALMOVEWEIGHT =totalmoveweight; 私有静态最后弦乐DATABASE_NAME =mymovingfriend;
私有静态最终诠释DATABASE_VERSION = 1; 公共静态最后弦乐KEY_TODOMOVE =todomove;
公共静态最后弦乐KEY_CB1 =CB1;
公共静态最后弦乐KEY_CB2 =CB2;
公共静态最后弦乐KEY_CB3 =CB3;
公共静态最后弦乐KEY_CB4 =CB4;
公共静态最后弦乐KEY_CB5 =CB5;
公共静态最后弦乐KEY_CB6 =CB6;
公共静态最后弦乐KEY_CB7 =CB7;
公共静态最后弦乐KEY_CB8 =CB8;
公共静态最后弦乐KEY_CB9 =CB9;
公共静态最后弦乐KEY_CB10 =CB10;
公共静态最后弦乐KEY_CB11 =CB11;
公共静态最后弦乐KEY_CB12 =CB12;
公共静态最后弦乐KEY_CB13 =CB13;
公共静态最后弦乐KEY_CB14 =CB14;
公共静态最后弦乐KEY_CB15 =CB15;
公共静态最后弦乐KEY_CB16 =cb16;
公共静态最后弦乐KEY_CB17 =CB17;
公共静态最后弦乐KEY_CB18 =CB18;
公共静态最后弦乐KEY_CB19 =cb19;
公共静态最后弦乐KEY_CB20 =CB20;
公共静态最后弦乐KEY_CB21 =CB21;
公共静态最后弦乐KEY_CB22 =CB22;
公共静态最后弦乐KEY_CB23 =CB23;
公共静态最后弦乐KEY_CB24 =CB24;
公共静态最后弦乐KEY_CB25 =CB25;
公共静态最后弦乐KEY_CB26 =cb26;
公共静态最后弦乐KEY_CB27 =cb27;
公共静态最后弦乐KEY_CB28 =cb28;
公共静态最后弦乐KEY_CB29 =cb29;
公共静态最后弦乐KEY_CB30 =CB30;
公共静态最后弦乐KEY_CB31 =CB31;
公共静态最后弦乐KEY_CB32 =cb32;
公共静态最后弦乐KEY_CB33 =cb33;
公共静态最后弦乐KEY_CB34 =CB34;
公共静态最后弦乐KEY_CB35 =cb35;
公共静态最后弦乐KEY_CB36 =cb36;
公共静态最后弦乐KEY_CB37 =cb37;
公共静态最后弦乐KEY_CB38 =cb38; 私有静态最后弦乐DATABASE_TABLE1 =movingname;
私有静态最后弦乐DATABASE_TABLE2 =movingrooms;
私有静态最后弦乐DATABASE_TABLE3 =movingitems;
私有静态最后弦乐DATABASE_TABLE4 =todolist的; 公共静态最后弦乐CREATE_TABLE_1 =CREATE TABLE+ DATABASE_TABLE1 +(+
KEY_ID1 +INTEGER PRIMARY KEY AUTOINCREMENT,+
KEY_MOVEDATE +TEXT NOT NULL,+
KEY_TOTALMOVEWEIGHT +TEXT NOT NULL,+
KEY_MOVENAME +TEXT NOT NULL);; 公共静态最后弦乐CREATE_TABLE_2 =CREATE TABLE+ DATABASE_TABLE2 +(+
KEY_ID2 +INTEGER PRIMARY KEY AUTOINCREMENT,+
KEY_ROOMMOVEHOLDER +TEXT NOT NULL,+
KEY_ROOMWEIGHT +TEXT NOT NULL,+
KEY_ROOM +TEXT NOT NULL);; 公共静态最后弦乐CREATE_TABLE_3 =CREATE TABLE+ DATABASE_TABLE3 +(+
KEY_ID3 +INTEGER PRIMARY KEY AUTOINCREMENT,+
KEY_ITEMNAME +TEXT NOT NULL,+
KEY_ITEMVALUE +TEXT NOT NULL,+
KEY_ROOMHOLDER +TEXT NOT NULL,+
KEY_ITEMWEIGHT +TEXT NOT NULL,+
KEY_ITEMMOVEHOLDER +TEXT NOT NULL);; 公共静态最后弦乐CREATE_TABLE_4 =CREATE TABLE+ DATABASE_TABLE4 +(+
KEY_ID4 +INTEGER PRIMARY KEY AUTOINCREMENT,+
KEY_TODOMOVE +TEXT NOT NULL,+
KEY_CB1 +TEXT NOT NULL,+
KEY_CB2 +TEXT NOT NULL,+
KEY_CB3 +TEXT NOT NULL,+
KEY_CB4 +TEXT NOT NULL,+
KEY_CB5 +TEXT NOT NULL,+
KEY_CB6 +TEXT NOT NULL,+
KEY_CB7 +TEXT NOT NULL,+
KEY_CB8 +TEXT NOT NULL,+
KEY_CB9 +TEXT NOT NULL,+
KEY_CB10 +TEXT NOT NULL,+
KEY_CB11 +TEXT NOT NULL,+
KEY_CB12 +TEXT NOT NULL,+
KEY_CB13 +TEXT NOT NULL,+
KEY_CB14 +TEXT NOT NULL,+
KEY_CB15 +TEXT NOT NULL,+
KEY_CB16 +TEXT NOT NULL,+
KEY_CB17 +TEXT NOT NULL,+
KEY_CB18 +TEXT NOT NULL,+
KEY_CB19 +TEXT NOT NULL,+
KEY_CB20 +TEXT NOT NULL,+
KEY_CB21 +TEXT NOT NULL,+
KEY_CB22 +TEXT NOT NULL,+
KEY_CB23 +TEXT NOT NULL,+
KEY_CB24 +TEXT NOT NULL,+
KEY_CB25 +TEXT NOT NULL,+
KEY_CB26 +TEXT NOT NULL,+
KEY_CB27 +TEXT NOT NULL,+
KEY_CB28 +TEXT NOT NULL,+
KEY_CB29 +TEXT NOT NULL,+
KEY_CB30 +TEXT NOT NULL,+
KEY_CB31 +TEXT NOT NULL,+
KEY_CB32 +TEXT NOT NULL,+
KEY_CB33 +TEXT NOT NULL,+
KEY_CB34 +TEXT NOT NULL,+
KEY_CB35 +TEXT NOT NULL,+
KEY_CB36 +TEXT NOT NULL,+
KEY_CB37 +TEXT NOT NULL,+
KEY_CB38 +TEXT NOT NULL);; 私人DbHelper ourHelper;
私人最终上下文ourContext;
私人SQLiteDatabase ourDatabase; 私有静态类DbHelper扩展SQLiteOpenHelper { 公共DbHelper(上下文的背景下){
超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
// TODO自动生成构造函数存根
} @覆盖
公共无效的onCreate(SQLiteDatabase DB){
// TODO自动生成方法存根
db.execSQL(CREATE_TABLE_1);
db.execSQL(CREATE_TABLE_2);
db.execSQL(CREATE_TABLE_3);
db.execSQL(CREATE_TABLE_4);
} @覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldversion,诠释静态网页){
// TODO自动生成方法存根
db.execSQL(DROP TABLE IF EXISTS+ DATABASE_TABLE1);
db.execSQL(DROP TABLE IF EXISTS+ DATABASE_TABLE2);
db.execSQL(DROP TABLE IF EXISTS+ DATABASE_TABLE3);
db.execSQL(DROP TABLE IF EXISTS+ DATABASE_TABLE4);
的onCreate(DB);
}
} 公共SQLHandler(上下文C){
ourContext = C;
} 公共SQLHandler的open()抛出的SQLException {
ourHelper =新DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
返回此;
} 公共无效的close(){
ourHelper.close();
} 众长createMove(字符串smovename){
ContentValues CV =新ContentValues();
cv.put(KEY_MOVENAME,smovename);
cv.put(KEY_MOVEDATE,尚未设置);
cv.put(KEY_TOTALMOVEWEIGHT,0);
返回ourDatabase.insert(DATABASE_TABLE1,空,CV);
} 众长setTodo(字符串smovename){
ContentValues CV =新ContentValues();
cv.put(KEY_TODOMOVE,smovename);
cv.put(KEY_CB1,未完成);
cv.put(KEY_CB2,未完成);
cv.put(KEY_CB3,未完成);
cv.put(KEY_CB4,未完成);
cv.put(KEY_CB5,未完成);
cv.put(KEY_CB6,未完成);
cv.put(KEY_CB7,未完成);
cv.put(KEY_CB8,未完成);
cv.put(KEY_CB9,未完成);
cv.put(KEY_CB10,未完成);
cv.put(KEY_CB11,未完成);
cv.put(KEY_CB12,未完成);
cv.put(KEY_CB13,未完成);
cv.put(KEY_CB14,未完成);
cv.put(KEY_CB15,未完成);
cv.put(KEY_CB16,未完成);
cv.put(KEY_CB17,未完成);
cv.put(KEY_CB18,未完成);
cv.put(KEY_CB19,未完成);
cv.put(KEY_CB20,未完成);
cv.put(KEY_CB21,未完成);
cv.put(KEY_CB22,未完成);
cv.put(KEY_CB23,未完成);
cv.put(KEY_CB24,未完成);
cv.put(KEY_CB25,未完成);
cv.put(KEY_CB26,未完成);
cv.put(KEY_CB27,未完成);
cv.put(KEY_CB28,未完成);
cv.put(KEY_CB29,未完成);
cv.put(KEY_CB30,未完成);
cv.put(KEY_CB31,未完成);
cv.put(KEY_CB32,未完成);
cv.put(KEY_CB33,未完成);
cv.put(KEY_CB34,未完成);
cv.put(KEY_CB35,未完成);
cv.put(KEY_CB36,未完成);
cv.put(KEY_CB37,未完成);
cv.put(KEY_CB38,未完成);
返回ourDatabase.insert(DATABASE_TABLE4,空,CV);
} 公共无效setMoveDate(字符串smovedate,字符串smovename){
ContentValues CV =新ContentValues();
cv.put(KEY_MOVEDATE,smovedate);
ourDatabase.update(DATABASE_TABLE1,CV,KEY_MOVENAME +='+ smovename +',NULL);
} 公共无效setRoomWeight(字符串sroomweight,字符串smovename,字符串sroomname){
ContentValues CV =新ContentValues();
cv.put(KEY_ROOMWEIGHT,sroomweight);
ourDatabase.update(DATABASE_TABLE2,CV,KEY_ROOMMOVEHOLDER +='+ smovename +'+和+ KEY_ROOM +='+ sroomname +',NULL);
} 公共无效updateTodo(字符串todoMove,INT todoName,弦乐todoValue){
ContentValues CV =新ContentValues();
的String [] = stodo新的String [] {KEY_CB1,KEY_CB2,KEY_CB3,KEY_CB4,KEY_CB5,KEY_CB6,KEY_CB7,KEY_CB8,KEY_CB9,KEY_CB10
,KEY_CB11,KEY_CB12,KEY_CB13,KEY_CB14,KEY_CB15,KEY_CB16,KEY_CB17,KEY_CB18,KEY_CB19,KEY_CB20
,KEY_CB21,KEY_CB22,KEY_CB23,KEY_CB24,KEY_CB25,KEY_CB26,KEY_CB27,KEY_CB28,KEY_CB29,KEY_CB30
,KEY_CB31,KEY_CB32,KEY_CB33,KEY_CB34,KEY_CB35,KEY_CB36,KEY_CB37,KEY_CB38};
cv.put(stodo [todoName],todoValue);
ourDatabase.update(DATABASE_TABLE4,CV,KEY_TODOMOVE +='+ todoMove +',NULL);
} 众长todolist的(字符串内的TodoItem){
ContentValues CV =新ContentValues();
cv.put(内的TodoItem,完成);
返回ourDatabase.insert(DATABASE_TABLE4,空,CV);
} 公共光标getMove(){
的String [] =列新的String [] {KEY_ID1,KEY_MOVENAME};
光标光标= ourDatabase.query(DATABASE_TABLE1,列,NULL,NULL,NULL,NULL,NULL);
返回游标;
} 公共字符串getTodo(串M,诠释田纳西州){
的String [] =列新的String [] {KEY_ID4,KEY_TODOMOVE,KEY_CB1,KEY_CB2,KEY_CB3,KEY_CB4,KEY_CB5,KEY_CB6,KEY_CB7,KEY_CB8,KEY_CB9,KEY_CB10
,KEY_CB11,KEY_CB12,KEY_CB13,KEY_CB14,KEY_CB15,KEY_CB16,KEY_CB17,KEY_CB18,KEY_CB19,KEY_CB20
,KEY_CB21,KEY_CB22,KEY_CB23,KEY_CB24,KEY_CB25,KEY_CB26,KEY_CB27,KEY_CB28,KEY_CB29,KEY_CB30
,KEY_CB31,KEY_CB32,KEY_CB33,KEY_CB34,KEY_CB35,KEY_CB36,KEY_CB37,KEY_CB38};
光标C = ourDatabase.query(DATABASE_TABLE4,列KEY_TODOMOVE +=+ M +',NULL,NULL,NULL,NULL); 如果(C!= NULL){
c.moveToFirst();
字符串TODO = c.getString(TN);
返回待办事项;
}
返回null;
}}
我发现,如果你使用open()和close()很多时候有你的程序将无法处理它的变化,所以我的建议是创建的open()和close(),所以我所做的是我创建了SQLiteOpenHelper只有一个实例有一个 SQLHandler
这样的事情。
SQLHandler新条目=新SQLHandler(背景);
newentry.open();
,然后将这个code到 onResume()和的onPause()
@覆盖
保护无效onResume(){
// TODO自动生成方法存根
super.onResume();
newentry.open();
} @覆盖
保护无效的onPause(){
// TODO自动生成方法存根
super.onPause();
newentry.close();
}
I've been getting this error recently I know the cause but i don't know how to fix it.
here is the error from the logcat:
10-05 02:34:00.177: E/SQLiteDatabase(1111): close() was never explicitly called on database '/data/data/standard.internet.marketing.mymovingfriend/databases/mymovingfriend'
10-05 02:34:00.177: E/SQLiteDatabase(1111): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1051)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:770)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at standard.internet.marketing.mymovingfriend.SQLHandler.open(SQLHandler.java:178)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at standard.internet.marketing.mymovingfriend.ListMovingNames$1.onClick(ListMovingNames.java:71)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.view.View.performClick(View.java:3511)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.view.View$PerformClick.run(View.java:14105)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.os.Handler.handleCallback(Handler.java:605)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.os.Handler.dispatchMessage(Handler.java:92)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.os.Looper.loop(Looper.java:137)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at android.app.ActivityThread.main(ActivityThread.java:4424)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at java.lang.reflect.Method.invokeNative(Native Method)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at java.lang.reflect.Method.invoke(Method.java:511)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-05 02:34:00.177: E/SQLiteDatabase(1111): at dalvik.system.NativeStart.main(Native Method)
10-05 02:34:00.216: E/System(1111): Uncaught exception thrown by finalizer
10-05 02:34:00.226: E/System(1111): java.lang.IllegalStateException: Don't have database lock!
10-05 02:34:00.226: E/System(1111): at android.database.sqlite.SQLiteDatabase.verifyLockOwner(SQLiteDatabase.java:2090)
10-05 02:34:00.226: E/System(1111): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2182)
10-05 02:34:00.226: E/System(1111): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2178)
10-05 02:34:00.226: E/System(1111): at android.util.LruCache.trimToSize(LruCache.java:197)
10-05 02:34:00.226: E/System(1111): at android.util.LruCache.evictAll(LruCache.java:285)
10-05 02:34:00.226: E/System(1111): at android.database.sqlite.SQLiteDatabase.deallocCachedSqlStatements(SQLiteDatabase.java:2143)
10-05 02:34:00.226: E/System(1111): at android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1126)
10-05 02:34:00.226: E/System(1111): at android.database.sqlite.SQLiteDatabase.finalize(SQLiteDatabase.java:1914)
10-05 02:34:00.226: E/System(1111): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:182)
10-05 02:34:00.226: E/System(1111): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168)
10-05 02:34:00.226: E/System(1111): at java.lang.Thread.run(Thread.java:856)
here is the code for the activity
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.selectorcreatemove);
allFunctions();
}
private void allFunctions() {
addMove = (Button) findViewById(R.id.bAddMove);
etAddMove = (EditText) findViewById(R.id.etMoveName);
MoveList = (ListView) findViewById(R.id.lvMoveItems);
SQLHandlerview = new SQLHandler(this);
SQLHandlerview = new SQLHandler(ListMovingNames.this);
SQLHandlerview.open();
cursor = SQLHandlerview.getMove();
startManagingCursor(cursor);
String[] from = new String[]{SQLHandler.KEY_MOVENAME};
int[] to = new int[]{R.id.text};
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to);
MoveList.setAdapter(cursorAdapter);
SQLHandlerview.close();
addMove.setOnClickListener(new OnClickListener() {
@SuppressLint("NewApi")
public void onClick(View v) {
// TODO Auto-generated method stub
String ssmoveName = etAddMove.getText().toString();
int x = ssmoveName.length() - 1;
if (ssmoveName.isEmpty() || Character.isWhitespace(ssmoveName.charAt(0)) || Character.isWhitespace(ssmoveName.charAt(x))) {
Toast.makeText(ListMovingNames.this,
"Please enter a valid name! Avoid giving a blank name or white space at the beginning or end of the name",
Toast.LENGTH_LONG).show();
}else{
try {
SQLHandler check = new SQLHandler(ListMovingNames.this);
check.open();
String scheck = check.checkMove(ssmoveName);
check.close();
if (scheck.equals(ssmoveName)) {
Toast.makeText(ListMovingNames.this, "Move name already exist please give a different name", Toast.LENGTH_LONG).show();
} else{
SQLHandler entry = new SQLHandler(ListMovingNames.this);
entry.open();
entry.createMove(ssmoveName);
entry.setTodo(ssmoveName);
Toast.makeText(ListMovingNames.this, "Okay", Toast.LENGTH_SHORT).show();
entry.close();
Intent i = new Intent(getApplicationContext(), StartMoving.class);
i.putExtra("moveName", ssmoveName);
startActivity(i);
}
} catch (Exception e) {
// TODO Auto-generated catch block
SQLHandler entry = new SQLHandler(ListMovingNames.this);
entry.open();
entry.createMove(ssmoveName);
entry.setTodo(ssmoveName);
entry.close();
Intent i = new Intent(getApplicationContext(), StartMoving.class);
i.putExtra("moveName", ssmoveName);
startActivity(i);
}
}
}
});
MoveList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, final View view, int position,
long id) {
// TODO Auto-generated method stub
move = ((TextView) view).getText().toString();
Intent i = new Intent(getApplicationContext(), StartMoving.class);
i.putExtra("moveName", move);
startActivity(i);
}
});
}
}
every time this line of code is called the error appears. entry.setTodo(ssmoveName);
and this method calls which is from my database handler.
public long setTodo(String smovename){
ContentValues cv = new ContentValues();
cv.put(KEY_TODOMOVE, smovename);
cv.put(KEY_CB1, "Not Done");
cv.put(KEY_CB2, "Not Done");
cv.put(KEY_CB3, "Not Done");
cv.put(KEY_CB4, "Not Done");
cv.put(KEY_CB5, "Not Done");
cv.put(KEY_CB6, "Not Done");
cv.put(KEY_CB7, "Not Done");
cv.put(KEY_CB8, "Not Done");
cv.put(KEY_CB9, "Not Done");
cv.put(KEY_CB10, "Not Done");
cv.put(KEY_CB11, "Not Done");
cv.put(KEY_CB12, "Not Done");
cv.put(KEY_CB13, "Not Done");
cv.put(KEY_CB14, "Not Done");
cv.put(KEY_CB15, "Not Done");
cv.put(KEY_CB16, "Not Done");
cv.put(KEY_CB17, "Not Done");
cv.put(KEY_CB18, "Not Done");
cv.put(KEY_CB19, "Not Done");
cv.put(KEY_CB20, "Not Done");
cv.put(KEY_CB21, "Not Done");
cv.put(KEY_CB22, "Not Done");
cv.put(KEY_CB23, "Not Done");
cv.put(KEY_CB24, "Not Done");
cv.put(KEY_CB25, "Not Done");
cv.put(KEY_CB26, "Not Done");
cv.put(KEY_CB27, "Not Done");
cv.put(KEY_CB28, "Not Done");
cv.put(KEY_CB29, "Not Done");
cv.put(KEY_CB30, "Not Done");
cv.put(KEY_CB31, "Not Done");
cv.put(KEY_CB32, "Not Done");
cv.put(KEY_CB33, "Not Done");
cv.put(KEY_CB34, "Not Done");
cv.put(KEY_CB35, "Not Done");
cv.put(KEY_CB36, "Not Done");
cv.put(KEY_CB37, "Not Done");
cv.put(KEY_CB38, "Not Done");
return ourDatabase.insert(DATABASE_TABLE4, null, cv);
}
here is my database handler anyway.
public class SQLHandler {
public static final String KEY_ROOMMOVEHOLDER = "roommoveholder";
public static final String KEY_ROOM = "room";
public static final String KEY_ROOMWEIGHT = "roomweight";
public static final String KEY_ITEMMOVEHOLDER = "itemmoveholder";
public static final String KEY_ITEMNAME = "itemname";
public static final String KEY_ITEMVALUE = "itemvalue";
public static final String KEY_ROOMHOLDER = "roomholder";
public static final String KEY_ITEMWEIGHT = "itemweight";
public static final String KEY_MOVENAME = "movename";
public static final String KEY_ID1 = "_id";
public static final String KEY_ID2 = "_id";
public static final String KEY_ID3 = "_id";
public static final String KEY_ID4 = "_id";
public static final String KEY_MOVEDATE = "movedate";
public static final String KEY_TOTALMOVEWEIGHT = "totalmoveweight";
private static final String DATABASE_NAME = "mymovingfriend";
private static final int DATABASE_VERSION = 1;
public static final String KEY_TODOMOVE = "todomove";
public static final String KEY_CB1 = "cb1";
public static final String KEY_CB2 = "cb2";
public static final String KEY_CB3 = "cb3";
public static final String KEY_CB4 = "cb4";
public static final String KEY_CB5 = "cb5";
public static final String KEY_CB6 = "cb6";
public static final String KEY_CB7 = "cb7";
public static final String KEY_CB8 = "cb8";
public static final String KEY_CB9 = "cb9";
public static final String KEY_CB10 = "cb10";
public static final String KEY_CB11 = "cb11";
public static final String KEY_CB12 = "cb12";
public static final String KEY_CB13 = "cb13";
public static final String KEY_CB14 = "cb14";
public static final String KEY_CB15 = "cb15";
public static final String KEY_CB16 = "cb16";
public static final String KEY_CB17 = "cb17";
public static final String KEY_CB18 = "cb18";
public static final String KEY_CB19 = "cb19";
public static final String KEY_CB20 = "cb20";
public static final String KEY_CB21 = "cb21";
public static final String KEY_CB22 = "cb22";
public static final String KEY_CB23 = "cb23";
public static final String KEY_CB24 = "cb24";
public static final String KEY_CB25 = "cb25";
public static final String KEY_CB26 = "cb26";
public static final String KEY_CB27 = "cb27";
public static final String KEY_CB28 = "cb28";
public static final String KEY_CB29 = "cb29";
public static final String KEY_CB30 = "cb30";
public static final String KEY_CB31 = "cb31";
public static final String KEY_CB32 = "cb32";
public static final String KEY_CB33 = "cb33";
public static final String KEY_CB34 = "cb34";
public static final String KEY_CB35 = "cb35";
public static final String KEY_CB36 = "cb36";
public static final String KEY_CB37 = "cb37";
public static final String KEY_CB38 = "cb38";
private static final String DATABASE_TABLE1 = "movingname";
private static final String DATABASE_TABLE2 = "movingrooms";
private static final String DATABASE_TABLE3 = "movingitems";
private static final String DATABASE_TABLE4 = "todolist";
public static final String CREATE_TABLE_1 = "CREATE TABLE " + DATABASE_TABLE1 + " (" +
KEY_ID1 + " INTEGER PRIMARY KEY AUTOINCREMENT," +
KEY_MOVEDATE + " TEXT NOT NULL, " +
KEY_TOTALMOVEWEIGHT + " TEXT NOT NULL, " +
KEY_MOVENAME + " TEXT NOT NULL);";
public static final String CREATE_TABLE_2 = "CREATE TABLE " + DATABASE_TABLE2 + " (" +
KEY_ID2 + " INTEGER PRIMARY KEY AUTOINCREMENT," +
KEY_ROOMMOVEHOLDER + " TEXT NOT NULL, " +
KEY_ROOMWEIGHT + " TEXT NOT NULL, " +
KEY_ROOM + " TEXT NOT NULL);";
public static final String CREATE_TABLE_3 = "CREATE TABLE " + DATABASE_TABLE3 + " (" +
KEY_ID3 + " INTEGER PRIMARY KEY AUTOINCREMENT," +
KEY_ITEMNAME + " TEXT NOT NULL, " +
KEY_ITEMVALUE + " TEXT NOT NULL, " +
KEY_ROOMHOLDER + " TEXT NOT NULL, " +
KEY_ITEMWEIGHT + " TEXT NOT NULL, " +
KEY_ITEMMOVEHOLDER + " TEXT NOT NULL);";
public static final String CREATE_TABLE_4 = "CREATE TABLE " + DATABASE_TABLE4 + " (" +
KEY_ID4 + " INTEGER PRIMARY KEY AUTOINCREMENT," +
KEY_TODOMOVE + " TEXT NOT NULL, " +
KEY_CB1 + " TEXT NOT NULL, " +
KEY_CB2 + " TEXT NOT NULL, " +
KEY_CB3 + " TEXT NOT NULL, " +
KEY_CB4 + " TEXT NOT NULL, " +
KEY_CB5 + " TEXT NOT NULL, " +
KEY_CB6 + " TEXT NOT NULL, " +
KEY_CB7 + " TEXT NOT NULL, " +
KEY_CB8 + " TEXT NOT NULL, " +
KEY_CB9 + " TEXT NOT NULL, " +
KEY_CB10 + " TEXT NOT NULL, " +
KEY_CB11 + " TEXT NOT NULL, " +
KEY_CB12 + " TEXT NOT NULL, " +
KEY_CB13 + " TEXT NOT NULL, " +
KEY_CB14 + " TEXT NOT NULL, " +
KEY_CB15 + " TEXT NOT NULL, " +
KEY_CB16 + " TEXT NOT NULL, " +
KEY_CB17 + " TEXT NOT NULL, " +
KEY_CB18 + " TEXT NOT NULL, " +
KEY_CB19 + " TEXT NOT NULL, " +
KEY_CB20 + " TEXT NOT NULL, " +
KEY_CB21 + " TEXT NOT NULL, " +
KEY_CB22 + " TEXT NOT NULL, " +
KEY_CB23 + " TEXT NOT NULL, " +
KEY_CB24 + " TEXT NOT NULL, " +
KEY_CB25 + " TEXT NOT NULL, " +
KEY_CB26 + " TEXT NOT NULL, " +
KEY_CB27 + " TEXT NOT NULL, " +
KEY_CB28 + " TEXT NOT NULL, " +
KEY_CB29 + " TEXT NOT NULL, " +
KEY_CB30 + " TEXT NOT NULL, " +
KEY_CB31 + " TEXT NOT NULL, " +
KEY_CB32 + " TEXT NOT NULL, " +
KEY_CB33 + " TEXT NOT NULL, " +
KEY_CB34 + " TEXT NOT NULL, " +
KEY_CB35 + " TEXT NOT NULL, " +
KEY_CB36 + " TEXT NOT NULL, " +
KEY_CB37 + " TEXT NOT NULL, " +
KEY_CB38 + " TEXT NOT NULL);";
private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
private static class DbHelper extends SQLiteOpenHelper{
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_TABLE_1);
db.execSQL(CREATE_TABLE_2);
db.execSQL(CREATE_TABLE_3);
db.execSQL(CREATE_TABLE_4);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE1);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE2);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE3);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE4);
onCreate(db);
}
}
public SQLHandler(Context c){
ourContext = c;
}
public SQLHandler open() throws SQLException{
ourHelper = new DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close(){
ourHelper.close();
}
public long createMove(String smovename){
ContentValues cv = new ContentValues();
cv.put(KEY_MOVENAME, smovename);
cv.put(KEY_MOVEDATE, "Not yet set");
cv.put(KEY_TOTALMOVEWEIGHT, "0");
return ourDatabase.insert(DATABASE_TABLE1, null, cv);
}
public long setTodo(String smovename){
ContentValues cv = new ContentValues();
cv.put(KEY_TODOMOVE, smovename);
cv.put(KEY_CB1, "Not Done");
cv.put(KEY_CB2, "Not Done");
cv.put(KEY_CB3, "Not Done");
cv.put(KEY_CB4, "Not Done");
cv.put(KEY_CB5, "Not Done");
cv.put(KEY_CB6, "Not Done");
cv.put(KEY_CB7, "Not Done");
cv.put(KEY_CB8, "Not Done");
cv.put(KEY_CB9, "Not Done");
cv.put(KEY_CB10, "Not Done");
cv.put(KEY_CB11, "Not Done");
cv.put(KEY_CB12, "Not Done");
cv.put(KEY_CB13, "Not Done");
cv.put(KEY_CB14, "Not Done");
cv.put(KEY_CB15, "Not Done");
cv.put(KEY_CB16, "Not Done");
cv.put(KEY_CB17, "Not Done");
cv.put(KEY_CB18, "Not Done");
cv.put(KEY_CB19, "Not Done");
cv.put(KEY_CB20, "Not Done");
cv.put(KEY_CB21, "Not Done");
cv.put(KEY_CB22, "Not Done");
cv.put(KEY_CB23, "Not Done");
cv.put(KEY_CB24, "Not Done");
cv.put(KEY_CB25, "Not Done");
cv.put(KEY_CB26, "Not Done");
cv.put(KEY_CB27, "Not Done");
cv.put(KEY_CB28, "Not Done");
cv.put(KEY_CB29, "Not Done");
cv.put(KEY_CB30, "Not Done");
cv.put(KEY_CB31, "Not Done");
cv.put(KEY_CB32, "Not Done");
cv.put(KEY_CB33, "Not Done");
cv.put(KEY_CB34, "Not Done");
cv.put(KEY_CB35, "Not Done");
cv.put(KEY_CB36, "Not Done");
cv.put(KEY_CB37, "Not Done");
cv.put(KEY_CB38, "Not Done");
return ourDatabase.insert(DATABASE_TABLE4, null, cv);
}
public void setMoveDate(String smovedate, String smovename){
ContentValues cv = new ContentValues();
cv.put(KEY_MOVEDATE, smovedate);
ourDatabase.update(DATABASE_TABLE1, cv, KEY_MOVENAME + "='" + smovename + "'", null);
}
public void setRoomWeight(String sroomweight, String smovename, String sroomname){
ContentValues cv = new ContentValues();
cv.put(KEY_ROOMWEIGHT, sroomweight);
ourDatabase.update(DATABASE_TABLE2, cv, KEY_ROOMMOVEHOLDER + "='" + smovename + "'" + " AND " + KEY_ROOM + "='" + sroomname + "'", null);
}
public void updateTodo(String todoMove, int todoName, String todoValue){
ContentValues cv = new ContentValues();
String[] stodo = new String[]{KEY_CB1, KEY_CB2, KEY_CB3, KEY_CB4, KEY_CB5, KEY_CB6, KEY_CB7, KEY_CB8, KEY_CB9, KEY_CB10
, KEY_CB11, KEY_CB12, KEY_CB13, KEY_CB14, KEY_CB15, KEY_CB16, KEY_CB17, KEY_CB18, KEY_CB19, KEY_CB20
, KEY_CB21, KEY_CB22, KEY_CB23, KEY_CB24, KEY_CB25, KEY_CB26, KEY_CB27, KEY_CB28, KEY_CB29, KEY_CB30
, KEY_CB31, KEY_CB32, KEY_CB33, KEY_CB34, KEY_CB35, KEY_CB36, KEY_CB37, KEY_CB38};
cv.put(stodo[todoName], todoValue);
ourDatabase.update(DATABASE_TABLE4, cv, KEY_TODOMOVE + "='" + todoMove + "'", null);
}
public long todoList(String todoitem){
ContentValues cv = new ContentValues();
cv.put(todoitem, "Done");
return ourDatabase.insert(DATABASE_TABLE4, null, cv);
}
public Cursor getMove(){
String[] columns = new String[]{KEY_ID1, KEY_MOVENAME};
Cursor cursor = ourDatabase.query(DATABASE_TABLE1, columns, null, null, null, null, null);
return cursor;
}
public String getTodo(String m, int tn){
String[] columns = new String[]{KEY_ID4, KEY_TODOMOVE, KEY_CB1, KEY_CB2, KEY_CB3, KEY_CB4, KEY_CB5, KEY_CB6, KEY_CB7, KEY_CB8, KEY_CB9, KEY_CB10
, KEY_CB11, KEY_CB12, KEY_CB13, KEY_CB14, KEY_CB15, KEY_CB16, KEY_CB17, KEY_CB18, KEY_CB19, KEY_CB20
, KEY_CB21, KEY_CB22, KEY_CB23, KEY_CB24, KEY_CB25, KEY_CB26, KEY_CB27, KEY_CB28, KEY_CB29, KEY_CB30
, KEY_CB31, KEY_CB32, KEY_CB33, KEY_CB34, KEY_CB35, KEY_CB36, KEY_CB37, KEY_CB38};
Cursor c = ourDatabase.query(DATABASE_TABLE4, columns, KEY_TODOMOVE + "= '" + m + "'", null, null, null, null);
if (c != null) {
c.moveToFirst();
String toDo = c.getString(tn);
return toDo;
}
return null;
}
}
I found out that if your using open() and close() many time there is a change that your program will not be able to handle it, so my advice is to create only one instance of your SQLiteOpenHelper open() and close() so what I did is that i created one SQLHandler
something like this.
SQLHandler newentry = new SQLHandler(context);
newentry.open();
and then insert this code to onResume() and onPause()
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
newentry.open();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
newentry.close();
}
这篇关于没有数据库的锁!在android系统的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!