`
lynen
  • 浏览: 128505 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

SQLiteDatabase使用问题总结

 
阅读更多

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使用SQLiteDatabase直接存取数据与图像

    总结,Android应用使用SQLite直接存取数据和图像涉及到创建数据库表、插入和查询操作,以及处理图像数据的转换。理解这些步骤是开发高效、可靠且具有良好用户体验的Android应用的基础。通过实践和调试,开发者可以...

    SQLiteDatabase

    总结来说,"SQLiteDatabase"是一个针对SQLite数据库的C++封装库,特别适合Cocos2d-x开发环境。它简化了SQLite的使用,提供了易于理解和使用的API,同时在`main`函数中的示例可以帮助开发者快速上手。在实际项目中,...

    androidDb.rar_ SQLiteDatabase_SQLiteDatabase_android

    总结一下,本示例"androidDb.rar_ SQLiteDatabase_SQLiteDatabase_android"展示了如何在Android应用中使用SQLite数据库进行数据管理。开发者需要创建`SQLiteOpenHelper`子类,定义数据库版本和表结构,在`onCreate()...

    实例讲解Android中SQLiteDatabase使用方法

    总结起来,Android中的SQLite数据库提供了方便的数据存储和管理机制,通过SQLiteOpenHelper和SQLiteDatabase,我们可以轻松地执行CRUD(创建、读取、更新、删除)操作。在实际开发中,可以根据需求创建合适的表结构...

    安卓开发实验6——SQLite和SQLiteDatabase应用

    3. **插入数据**:使用SQLiteDatabase的`insert()`方法将新闻信息添加到数据库。创建ContentValues对象来存储键值对,然后调用`insert()`方法。 ```java ContentValues values = new ContentValues(); values.put...

    SQLitedatabase的工程练习源码

    总结来说,"SQLiteDatabase的工程练习源码"是一个很好的起点,它涵盖了Android中SQLite数据库的基础操作,包括创建数据库、创建表、插入数据、查询数据以及数据库版本管理等。通过这个练习,初学者可以逐步熟悉...

    SQLiteDatabase增删改查示例代码

    总结,`SQLiteDatabase`是Android系统内置的数据库API,适合手动编写SQL进行数据库操作,而greenDao则提供了面向对象的接口,降低了数据库操作的复杂性。选择哪种方式取决于项目需求,如果需要更精细的SQL控制,`...

    西工大安卓大作业-日记本(源码+实验报告+问题总结)

    使用SQLiteDatabase数据库存储日记内容。 首先要有一个LoginActivity,输入密码,点击按钮,判断密码是否正确后,用intent跳转到MainActivity。 MainActivity主要包括activity_main里列表的关联,实现点击列表时跳转...

    Android基础-初识SQLite(源代码)

    1. 插入数据(Insert):使用`SQLiteDatabase`对象的`insert()`方法,配合SQL的`INSERT INTO`语句将数据写入表中。 2. 查询数据(Select):使用`rawQuery()`或`query()`方法执行SQL的`SELECT`语句,获取Cursor对象...

    Android创建和使用数据库详细指南

    1. 插入数据:使用SQL的INSERT INTO语句插入数据,通过SQLiteDatabase对象的insert()方法执行。 ```java public void insertData(String name, int age) { SQLiteDatabase db = this.getWritableDatabase(); ...

    android学习之SQLite总结(1)

    - **创建数据库**:通常在`onCreate()`回调方法中创建数据库,通过`SQLiteDatabase.create()`或`openOrCreateDatabase()`方法。 - **升级数据库**:当数据库版本变更时,`onUpgrade()`方法会被调用,用于更新表...

    android sqllite数据库的使用

    总结,Android中SQLite数据库的使用涉及创建数据库和表、插入、查询、更新、删除数据以及事务处理等多个方面。理解并熟练掌握这些基本操作,将有助于我们在开发过程中有效地管理和操作数据。在实际项目中,根据需求...

    android sqllite增删改查

    使用SQLiteDatabase对象的insert()方法将数据插入表中。例如,插入一条学生记录: ```java public boolean insertData(String name, int age) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues ...

    安卓 数据库 Database SQLite

    总结来说,SQLite是Android开发中不可或缺的一部分,用于存储应用程序的持久数据。理解其基本操作和如何在Android环境中有效地使用SQLite,是每个Android开发者必备的技能。通过`SQLiteOpenHelper`、`...

    android SQLiteOpenHelper使用示例

    使用`getWritableDatabase()`或`getReadableDatabase()`打开数据库后,我们就可以通过返回的SQLiteDatabase对象执行查询、插入、更新和删除操作。例如: ```java SQLiteDatabase db = dbHelper.getWritableDatabase...

    Android使用SharedPreferences和SQLite数据库实现数据存储

    4. 插入数据:使用SQL的INSERT语句,或者使用ContentValues配合SQLiteDatabase的insert()方法。 5. 查询数据:使用SQL的SELECT语句,或者SQLiteDatabase的query()、rawQuery()方法,返回Cursor对象,遍历获取数据。 ...

    android:kotlin语言使用greendao数据库简解

    总结,使用Kotlin和GreenDao 3.0在Android开发中可以简化数据库操作,提高代码可读性和可维护性。通过实体类、Dao接口以及`DaoSession`,你可以方便地执行CRUD操作,并利用事务处理确保数据的一致性。不过要注意,...

    Android-Android数据库SQLite的简单使用实现我的便签

    总结一下,Android中的SQLite数据库是实现本地数据存储的重要工具,尤其适合管理结构化的数据。通过`SQLiteOpenHelper`,我们可以轻松地创建数据库和表,然后实现CRUD(创建、读取、更新、删除)操作。结合用户界面...

    解决Sqlite中文排序问题(网页)

    在SQLiteDatabase,特别是SQLite3中,处理中文排序问题是一个常见的挑战。SQLite3是一个轻量级、自包含的数据库引擎,广泛应用于嵌入式系统和移动应用。然而,它默认的排序规则可能不适用于中文字符,因为中文字符的...

    Android之SQlite存储

    接下来,我们使用`SQLiteDatabase`对象执行SQL命令。例如,`SQLiteDatabase.insert()`用于插入数据,`SQLiteDatabase.query()`用于查询数据,`SQLiteDatabase.update()`用于更新数据,`SQLiteDatabase.delete()`用于...

Global site tag (gtag.js) - Google Analytics