打开或者创建数据库的操作应该放在哪里?
来源:互联网 发布:网络支付平台的弊端 编辑:程序博客网 时间:2024/04/30 03:08
打开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 { <strong>db = helData.getReadableDatabase();//<span style="color:#ff6666;">这里是不是要if(db == null || db.isOpen() == false)</span></strong> 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;}}
<strong>//这里必须要关闭cursor,关闭db,关闭helper,否则报dbexception异常</strong>@Overrideprotected void onDestroy() { System.out.println("onDestroy"); super.onDestroy(); if (db!=null){ db.close(); } if (cursor!=null){ cursor.close(); } if ( helData!=null){ helData.close(); }}}
- 打开或者创建数据库的操作应该放在哪里?
- 判断的标准应该放在哪里?
- javascript应该放在哪里?
- 类的内联函数的实现应该放在哪里
- 类的内联函数的实现应该放在哪里
- 到底应该把网站放在哪里?
- 到底应该把网站放在哪里?
- 应该把script标签放在哪里
- DLL文件应该放在哪里?
- script到底应该放在哪里
- Xcode 里 用相对路径打开文件 文件应该放在哪里
- 前端-JS和CSS的引入/写入位置应该放在哪里?
- 应该在哪里关闭SQLite数据库的链接
- XP系统缺少msxml4.dll文件,应该放在哪里?
- SpringMVC——DispatcherServlet配置文件应该放在哪里?
- classpath:applicationContext.xml这个xml文件应该放在哪里?
- 页面编码的问题-关于HTTP头应该放哪里
- 系统的 Daemons 放在哪里
- oracle sql 按时间统计(天、周、月、季、年)
- python 不超过20行的小练习
- class 的static成员变量和 static 成员函数
- 近来写一个三维家居软件的历程
- Toy Storage(二维计算几何基础)
- 打开或者创建数据库的操作应该放在哪里?
- Override和final
- openstack Networking in too much detail
- Python数据结构:序列(列表[]、元组())与映射(字典{})语法总结
- C++ 用libcurl库进行http 网络通讯编程
- J2EE编程心得-使用Hibernate出现的错误及解决方法 更新中...
- Cocos2d-x JSB + Cocos2d-html5 跨平台游戏开发(一)—— 引擎选择
- PHP中比较两个时间的大小与日期的差值
- LeetCode | Minimum Path Sum(最小路径和)