SQLiteDatabase使用过程中经常碰到的问题
1.DatabaseHelper在onCreate或者是onUpdate的时候调用DatabaseHelper.getWriteDatabase获取SQLiteDatabase
会导致一个递归死循环
解决方案:
如果在onCreate或者是onUpdate的时候需要获取一个SQLiteDatabase进行数据的读取与写入,应该在onCreate或者是onUpdate的时候设定这个过程中本身对应的SQLiteDatabase
2.多个线程中同时进行多张数据表的写(读数据是没有关系的)
写数据的使用,应该使用线程锁synchronized进行锁定,同时线程锁的对象应该是整个app中相同的database中完全一样的
3.多个线程中进行多张数据表的写,写完之后调用SQLiteDatabase.close进行了资源的关闭
例如,存在A,B,C,D...N多个线程,其中,B线程中在数据写完后进行了Databse.close操作
在A线程拿到线程锁进行写数据的时候,SQLiteDatabase会提示数据库已经关闭,不能进行数据的写入操作
解决方案:在获取writableDatabase的与readableDatabase的时候,应该通过函数来完成,例如:
private AtomicInteger mOpenCounter = new AtomicInteger(); /** * openDatabase与relaseDatabase需要配对出现 * @return */ public synchronized SQLiteDatabase openWriteDatabase() { final String userId = this.mCurrentUserId; DatabaseSQLiteHelper helper = getSQLiteHelper(userId); SQLiteDatabase db = getSQLiteHelper(userId).getDefaultWritableDatabase(); //db为空的情况或者是db已经关闭的情况 if(db == null || !db.isOpen()){ db = helper.getWritableDatabase(); helper.setDefaultWritableDatabase(db); } //每次调用一次,就将计数器往上加1次 incrementDatabseUsed(helper); return db; } /** * openDatabase与relaseDatabase需要配对出现 * @return */ public synchronized void relaseWriteDatabase(){ decrementWriteDatabseUsed(true); } private Object mAtomicLoker = new Object(); void incrementDatabseUsed(DatabaseSQLiteHelper helper){ synchronized (mAtomicLoker) { int result = mOpenCounter.incrementAndGet(); } } void decrementWriteDatabseUsed(boolean isCloseDatabse){ synchronized (mAtomicLoker) { final String userId = this.mCurrentUserId; if(TextUtils.isEmpty(userId)){ return; } DatabaseSQLiteHelper helper = getSQLiteHelper(userId); int result = mOpenCounter.decrementAndGet(); if(isCloseDatabse && !helper.isDoingDataMigratoring){ if(result <= 0){ SQLiteDatabase db = helper.getDefaultWritableDatabase(); if(db != null){ db.close(); } db = helper.getReadableDatabase(); if(db != null){ int currentResult = mOpenCounter.get(); if(currentResult <= 0){ db.close(); } } } } } }
相关推荐
总结,Android应用使用SQLite直接存取数据和图像涉及到创建数据库表、插入和查询操作,以及处理图像数据的转换。理解这些步骤是开发高效、可靠且具有良好用户体验的Android应用的基础。通过实践和调试,开发者可以...
总结来说,"SQLiteDatabase"是一个针对SQLite数据库的C++封装库,特别适合Cocos2d-x开发环境。它简化了SQLite的使用,提供了易于理解和使用的API,同时在`main`函数中的示例可以帮助开发者快速上手。在实际项目中,...
总结一下,本示例"androidDb.rar_ SQLiteDatabase_SQLiteDatabase_android"展示了如何在Android应用中使用SQLite数据库进行数据管理。开发者需要创建`SQLiteOpenHelper`子类,定义数据库版本和表结构,在`onCreate()...
总结起来,Android中的SQLite数据库提供了方便的数据存储和管理机制,通过SQLiteOpenHelper和SQLiteDatabase,我们可以轻松地执行CRUD(创建、读取、更新、删除)操作。在实际开发中,可以根据需求创建合适的表结构...
3. **插入数据**:使用SQLiteDatabase的`insert()`方法将新闻信息添加到数据库。创建ContentValues对象来存储键值对,然后调用`insert()`方法。 ```java ContentValues values = new ContentValues(); values.put...
总结来说,"SQLiteDatabase的工程练习源码"是一个很好的起点,它涵盖了Android中SQLite数据库的基础操作,包括创建数据库、创建表、插入数据、查询数据以及数据库版本管理等。通过这个练习,初学者可以逐步熟悉...
总结,`SQLiteDatabase`是Android系统内置的数据库API,适合手动编写SQL进行数据库操作,而greenDao则提供了面向对象的接口,降低了数据库操作的复杂性。选择哪种方式取决于项目需求,如果需要更精细的SQL控制,`...
使用SQLiteDatabase数据库存储日记内容。 首先要有一个LoginActivity,输入密码,点击按钮,判断密码是否正确后,用intent跳转到MainActivity。 MainActivity主要包括activity_main里列表的关联,实现点击列表时跳转...
1. 插入数据(Insert):使用`SQLiteDatabase`对象的`insert()`方法,配合SQL的`INSERT INTO`语句将数据写入表中。 2. 查询数据(Select):使用`rawQuery()`或`query()`方法执行SQL的`SELECT`语句,获取Cursor对象...
1. 插入数据:使用SQL的INSERT INTO语句插入数据,通过SQLiteDatabase对象的insert()方法执行。 ```java public void insertData(String name, int age) { SQLiteDatabase db = this.getWritableDatabase(); ...
- **创建数据库**:通常在`onCreate()`回调方法中创建数据库,通过`SQLiteDatabase.create()`或`openOrCreateDatabase()`方法。 - **升级数据库**:当数据库版本变更时,`onUpgrade()`方法会被调用,用于更新表...
总结,Android中SQLite数据库的使用涉及创建数据库和表、插入、查询、更新、删除数据以及事务处理等多个方面。理解并熟练掌握这些基本操作,将有助于我们在开发过程中有效地管理和操作数据。在实际项目中,根据需求...
使用SQLiteDatabase对象的insert()方法将数据插入表中。例如,插入一条学生记录: ```java public boolean insertData(String name, int age) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues ...
总结来说,SQLite是Android开发中不可或缺的一部分,用于存储应用程序的持久数据。理解其基本操作和如何在Android环境中有效地使用SQLite,是每个Android开发者必备的技能。通过`SQLiteOpenHelper`、`...
使用`getWritableDatabase()`或`getReadableDatabase()`打开数据库后,我们就可以通过返回的SQLiteDatabase对象执行查询、插入、更新和删除操作。例如: ```java SQLiteDatabase db = dbHelper.getWritableDatabase...
4. 插入数据:使用SQL的INSERT语句,或者使用ContentValues配合SQLiteDatabase的insert()方法。 5. 查询数据:使用SQL的SELECT语句,或者SQLiteDatabase的query()、rawQuery()方法,返回Cursor对象,遍历获取数据。 ...
总结,使用Kotlin和GreenDao 3.0在Android开发中可以简化数据库操作,提高代码可读性和可维护性。通过实体类、Dao接口以及`DaoSession`,你可以方便地执行CRUD操作,并利用事务处理确保数据的一致性。不过要注意,...
总结一下,Android中的SQLite数据库是实现本地数据存储的重要工具,尤其适合管理结构化的数据。通过`SQLiteOpenHelper`,我们可以轻松地创建数据库和表,然后实现CRUD(创建、读取、更新、删除)操作。结合用户界面...
在SQLiteDatabase,特别是SQLite3中,处理中文排序问题是一个常见的挑战。SQLite3是一个轻量级、自包含的数据库引擎,广泛应用于嵌入式系统和移动应用。然而,它默认的排序规则可能不适用于中文字符,因为中文字符的...
接下来,我们使用`SQLiteDatabase`对象执行SQL命令。例如,`SQLiteDatabase.insert()`用于插入数据,`SQLiteDatabase.query()`用于查询数据,`SQLiteDatabase.update()`用于更新数据,`SQLiteDatabase.delete()`用于...