您好,欢迎访问一九零五行业门户网

打开或者创建数据库的操作应该放在哪里?

打开strictmode后, db = new aliuserdbhelper(context).getreadabledatabase(); 这一行报错,大概就说strictmodereadviolation 然后看到网上有人说这个读写还可能出现死锁的问题,等。 在getreadabledatabase方法的注释中说道:该操作是耗时的,不要放在主
打开strictmode后,
db = new aliuserdbhelper(context).getreadabledatabase(); 这一行报错,大概就说strictmodereadviolation
然后看到网上有人说这个读写还可能出现死锁的问题,等。
在getreadabledatabase方法的注释中说道:该操作是耗时的,不要放在主线程里,也不要在contentprovider的oncreate方法中调用。
 {@link #getwritabledatabase}, this method may
     * take a long time to return, so you should not call it from the
     * application main thread, including from
     * {@link android.content.contentprovider#oncreate contentprovider.oncreate()}.
那创建数据库的操作应该放在哪里呢?难到真是要开个线程,再传个handler给main/ui thread?
安卓sdk的demo有一个notepad,就是在contentprovider的oncreate方法中开的数据库
这个demo肯定是不行的,正确的做法如下:
简单讲,就是dbhelper的构造器只new自己,不要开数据库,不要调用getreadabledatabase的操作,
把getreadabledatabase的操作放在具体的insert,remove,delete等的方法体中,这些方法是可以异步调用的,而且往往应该异步调用
举个栗子
**datasqlhelper .class**public class datasqlhelper extends sqliteopenhelper {private static final string database_name = test.db;private static final int database_version = 1; public datasqlhelper (context context) {super(context, database_name, null, database_version);}@overridepublic void oncreate(sqlitedatabase db) { string sql = create table + table + ( + basecolumns._id + integer primary key autoincrement, + id + text, + password + text, + active + text, + status + text);; db.execsql(sql);}@overridepublic void onupgrade(sqlitedatabase db, int oldversion, int newversion) {if (oldversion >= newversion) return;string sql = null;if (oldversion == 1) sql = alter table + table + add note text;;if (oldversion == 2) sql = ;if (sql != null) db.execsql(sql);} @override public synchronized void close() { super.close(); }} // ***test_java .java*** public class test_java extends activity { datasqlhelper heldata;sqlitedatabase db;cursor cursor;@overridepublic void oncreate(bundle savedinstancestate) {super.oncreate(savedinstancestate); setcontentview(r.layout.main); try { heldata= new datasqlhelper(this); cursor = getdata(); startmanagingcursor(cursor); setcontentview(r.layout.view);} catch (exception ex) { } } // oncreate ends//因为这里只有一个方法,如果开多个方法的话,那么是不是要判断db是否为空,以及是否打开,在调用db = heldata.getreadabledatabase()方法?private cursor getdata() {try { db = heldata.getreadabledatabase();//这里是不是要if(db == null || db.isopen() == false) cursor = db.query(datasqlhelper.table, null, null, null, null, null, null); startmanagingcursor(cursor); return cursor;} catch (exception ex) { system.out.println(exception occured : + ex.tostring()); return null;}}
//这里必须要关闭cursor,关闭db,关闭helper,否则报dbexception异常@overrideprotected void ondestroy() { system.out.println(ondestroy); super.ondestroy(); if (db!=null){ db.close(); } if (cursor!=null){ cursor.close(); } if ( heldata!=null){ heldata.close(); }}}
其它类似信息

推荐信息