首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

小白到大神,你需要了解 sqlite 最佳实践

5) 产生这个错误原因是因为,每次你创建新 SQLiteOpenHelper 对象,实际上你创建了新数据库连接。...如果你尝试从不同连接同时对数据库写入数据,其中一个会失败。 为了在多线程使用数据库,我们要确保只使用一个数据库连接。...,Thread1 和 Thread2 getDatabase() 方法都会返回同一个 SQLiteDatabase 对象实例。...我们需要确保没有人正在使用数据库,这个时候我们才可以关闭它。stackoveflow 上有人推荐永远不要关闭 SQLiteDatabase。这会让你看到下面的 logcat 信息。...Leak foundCaused by: java.lang.IllegalStateException: SQLiteDatabase created and never closed 实战例子 一种可能解决方案是使用计数器跟踪打开

92030

高效解决「SQLite」数据库并发访问安全问题,只这一篇就够了

这时,如果你尝试着,同时从实际不同链接中,对数据库进行写入操作,失败就是必然了。...: SQLiteDatabase 不要慌,我们仔细分析下报错,我们发现:单例模式使用保证了我们,在线程一、二「Thread 1、Thread 2 中」只会获得到唯一 SQLiteHelper 对象,...为了解决这个问题,我们引入计数器概念 标准样例 通过如下方法,你将通过一个计数器来完美解决 打开/关闭 数据库连接问题: public class DatabaseManager { private...在这个方法中,我们有一个,用来记录数据库被“打开”了几次 mOpenCounter 对象。当它等于 1 时,这意味着你需要去创建新数据库连接来使用数据库,否则的话,就说明数据库已经在使用中了。...同样情况也发生在 closeDatabase() 方法中,当你每次调用该方法时,我们 mOpenCounter 对象就会减一。当它减到 0 时,我们就去关闭这个数据库连接。

2.3K21
您找到你想要的搜索结果了吗?
是的
没有找到

Android中SQLite数据库小计

我们应该一直通过帮助类来获得数据库对应SQLiteDatabase对象,因为它保证返回给我们是完整、初始化好、可使用数据库(这里指数据库连接打开)。...最好不要自己类中去使用字段持有一个SQLiteDatabase对象,Helper类提供了数据库对象创建,打开关闭方法,自己维护SQLiteDatabase对象对象很容易陷入一个废弃、无法使用状态...数据库对象管理 安卓应用程序在使用数据库时,需要考虑对SQLiteDatabase对象生命周期管理。一个打开数据库对象大约占1KB内存。...——也就无法去关闭db对象连接了。...一个db对象关闭db对象也应该通过dbHelper.close()方法来关闭

2K90

android学习笔记----SQLite数据库

这两个方法都可以创建或者打开一个现有的数据库(如果数据库存在则直接打开,否则创建一个新数据库),并返回一个可对数据库进行读写对象。...不同是,当数据库不可写入时候(如磁盘空间已满),getReadableDatabase()方法返回对象将以只读方式去打开数据库,而getWritableDatabase()方法将抛出异常。    ...(); // 如果数据库存在就打开,否则创建一个新数据库 // db.execSQL("insert into contactinfo (name, phone) values(?...返回一个Cursor时,db是不能关闭 // 否则抛出java.lang.IllegalStateException: Cannot perform this operation because...注意:当用ContentProvider返回一个Cursor时,db是不能关闭,否则抛出异常java.lang.IllegalStateException: Cannot perform this operation

96620

Android数据库多线程并发操作异常

多个数据库对象执行并发 指由不同SQLiteOpenHelper打开相同数据库对象,默认enableWriteAheadLogging=false。 多线程 单进程和多进程结果一样。...一个数据库对象执行并发 多线程操作问题:已经打开数据库在进行读写时候被其他地方调用了close关闭了数据库。...java.lang.IllegalStateException: attempt to re-open an already-closed object 同一个SQLiteOpenHelper实例获取...database是相同,多在线程情况下应该进行统一open和close,所以一般都通过单例去管理database 打开关闭。...数据库连接池 如果 SQLiteOpenHelper 使用是单例,SQLiteDatabase 对CRUD 操作都是从同一个连接池中获取连接.

1.8K30

【Android 应用开发】Android 数据存储 之 SQLite数据库详解

使用SQLiteDataBase操作数据库 SQLiteDataBase简介 : SQLIteDataBase代表一个数据库, 其本质是一个数据库文件, 创建该类对象, 可以使用该对象一系列方法操作数据库...对象; Cursor cursor = db.rawQuery("select * from news_table", null); 关闭数据库 : 检查 SQLiteDataBase对象 是否为..., 重新获取Cursor, 使用Cursor刷新ListView内容 * 异常访问 : 如果访问出现了SQLiteException异常, 说明数据库不存在, 这时就需要先创建数据库 */ public...类中方法介绍 (1) 读写打开数据库 以读写方式打开数据库 :先以读写方式打开数据库, 如果磁盘满了, 就会打开失败,然后会尝试以只读方式打开数据库; public SQLiteDatabase...方法; (5) 关闭数据库 关闭打开数据库 :  public synchronized void close () 2.

2.4K10

Android Sqlite并发问题

db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE); Cursor...会创建一个数据库实例SQLiteDatabase,如果在不同进程如果通过shareuserid来实现数据库共享,那么会造成每一个进程都有SQLiteDatabase对象,在并发操作时候也有可能会出现如上问题...暴露出去接口来实现对宿主app进程数据库操作,实际上这时候数据库操作就都是由宿主app进程来操作了,就不会出现如上异常 拓展 上面提及数据库操作异常code是5,对应是SQLITE_BUSY...比如,有一个删除表操作发生在其他线程在对这个表进行读操作过程中,那么就会报SQLITE_LOCKED异常,也就是说一个线程删除表操作和另一个线程对相同表读取操作存在冲突,前提是这两个操作都是使用同一个数据库连接...java.lang.IllegalStateException: get field slot from row 0 col 0 failed异常,这个异常是数据库在执行查询操作时候,如果数据库中一条记录所占用内存大于

1.4K40

Android开发笔记(三十)SQLite数据库基础操作

SQLiteDatabase是SQLite数据库管理类,我们可在Activity页面代码或者任何能取到Context地方获取数据库实例,参考代码如下: //创建数据库,如果存在则打开...: 管理类 openDatabase : 打开指定路径数据库 isOpen : 判断数据库是否打开 close : 关闭数据库 getVersion : 获取数据库版本号 setVersion...SQLiteOpenHelper 因为SQLiteDatabase存在局限性,例如必须小心不能重复打开数据库,还有app每次升级同时升级数据库很不方便,所以Android提供了一个帮助工具,用于指导我们进行...其中onCreate只在第一次打开数据库时执行,而onUpgrade在打开数据库发现版本变化时都会执行,在onUpgrade函数内部,我们可以根据不同新旧版本号进行相应处理。...另外我们还得对该类运用单例模式,确保每次取出数据库对象都是唯一,这样就避免了重复打开数据库。

62730

Flink 实践教程:进阶7-基础运维

除了这些常见异常,文档也对其他报错信息进行了指导分析,如快照失败(超时)、超时/失败(上章节说明)、异常、WARN 和 ERROR 日志、可忽略报错信息。...需尝试增加作业算子并行度(CU)数和优化内存占用,避免内存泄露。...JVM 退出等致命错误:进程退出码通常出现在 exit code/shutting down JVM/fatal/kill/killing 关键字后,可以辅助定位 JVM 或 Akka 等发生了致命错误被强制关闭错误...需尝试增加作业算子并行度(CU)数和优化内存占用,避免内存泄露 JVM 退出等致命错误 进程退出码通常出现在以下关键字后,可以辅助定位 JVM 或 Akka 等发生了致命错误被强制关闭错误:exit...搜索 Exception 关键字,可以从各级异常 Caused by 中看到具体异常 WARN 和 ERROR 日志 一般情况下也可以搜索所有含 WARN 和 ERROR 关键字日志,可能有较多结果

2.5K31

Flink 实践教程-进阶(7):基础运维

除了这些常见异常,文档也对其他报错信息进行了指导分析,如快照失败(超时)、超时/失败(上章节说明)、异常、WARN 和 ERROR 日志、可忽略报错信息。...需尝试增加作业算子并行度(CU)数和优化内存占用,避免内存泄露。...JVM 退出等致命错误:进程退出码通常出现在 exit code/shutting down JVM/fatal/kill/killing 关键字后,可以辅助定位 JVM 或 Akka 等发生了致命错误被强制关闭错误...需尝试增加作业算子并行度(CU)数和优化内存占用,避免内存泄露 JVM 退出等致命错误 进程退出码通常出现在以下关键字后,可以辅助定位 JVM 或 Akka 等发生了致命错误被强制关闭错误:exit...搜索 Exception 关键字,可以从各级异常 Caused by 中看到具体异常 WARN 和 ERROR 日志 一般情况下也可以搜索所有含 WARN 和 ERROR 关键字日志,可能有较多结果

2.2K10

Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析

SQLiteOpenHelper类数据库操作方法介绍 方法名 作用 备注 onCreate() 创建数据库 创建数据库时自动调用 onUpgrade() 升级数据库 close() 关闭所有打开数据库对象.../写数据库 通过返回SQLiteDatabase对象对数据库进行操作 getReadableDatabase() 创建或打开可读数据库 同上 ---- 3....创建并打开数据库 // 创建DatabaseHelper对象(记得传入最新版本数据库) // 只执行这句话是不会创建或打开连接 //注意,一定要传入最新数据库版本号 SQLiteOpenHelper...创建并打开数据库 // 创建DatabaseHelper对象 // 只执行这句话是不会创建或打开连接 ////注意,一定要传入最新数据库版本号 SQLiteOpenHelper...c.isAfterLast(); //是否指向最后一条之后 c.isNull(int columnIndex); //指定列是否为空(列基数为0) c.isClosed(); //游标是否关闭

29.4K1511

Android中SQLite数据库知识点总结

增加一条数据 下面以 alan.db 数据库中person表为例,介绍如何使用 SQLiteDatabase对象insert()方法向表中插入一条数据,示例代码如下。...//获取可写入 SQLiteDatabase 对象 ContentValues values = new ContentValues(); //创建 ContentValues 对象 values.put...需要注意是,使用完SQLiteDatabase对象后定要调用close()方法关闭,否则数据库连接会一直存在,不断消耗内存,当系统内存不足时将获取不到SQLiteDatabase对象,并且会报出数据库未关闭异常...需要注意是,在使用完Cursor对象后,一定要及时关闭,否则会造成内存泄露。下面介绍如何使用SQLiteDatabasequery()方法查询数据,示例代码如下。...c.isAfterLast(); //是否指向最后一条之后 c.isNull(int columnIndex); //指定列是否为空(列基数为0) c.isClosed(); //游标是否关闭

1.4K30

Android SQLite 数据库学习

增加一条数据   下面以 alan.db 数据库中person表为例,介绍如何使用 SQLiteDatabase对象insert()方法向表中插入一条数据,示例代码如下。...; //获取可写入 SQLiteDatabase 对象     ContentValues values = new ContentValues();  //创建 ContentValues 对象...需要注意是,使用完SQLiteDatabase对象后定要调用close()方法关闭,否则数据库连接会一直存在,不断消耗内存,当系统内存不足时将获取不到SQLiteDatabase对象,并且会报出数据库未关闭异常...需要注意是,在使用完Cursor对象后,一定要及时关闭,否则会造成内存泄露。下面介绍如何使用SQLiteDatabasequery()方法查询数据,示例代码如下。...c.isAfterLast();    //是否指向最后一条之后  c.isNull(int columnIndex);  //指定列是否为空(列基数为0)  c.isClosed();      //游标是否关闭

1.2K00

Android编程之数据库创建方法详解

db可以用来执行sql语句 @Override public void onCreate(SQLiteDatabase db) { //通过SQLiteDatabase执行一个创建表...: context :上下文 , name:数据库文件名称 factory:用来创建cursor对象,默认为null version:数据库版本号,从1开始,如果发生改变,onUpgrade方法将会调用...,4.0之后只能升不能降 super(context, "info.db", null,1); 2.创建这个帮助类一个对象,调用getReadableDatabase()方法,会帮助我们创建打开一个数据库...sql语句 onUpgrade数据库版本号发生改变时才会执行; 特别适合做表结构修改 帮助类对象getWritableDatabase 和 getReadableDatabase都可以帮助我们获取一个数据库操作对象...区别: getReadableDatabase: 先尝试以读写方式打开数据库,如果磁盘空间满了,他会重新尝试以只读方式打开数据库。

45641

Android数据库开源框架GreenDao分析

前段时间写Demo时候遇到了数据库并发问题 Android数据库多线程并发操作异常 ,然后研究了一下 Android中数据库连接池 。...; ContentValues容量调整,内部是HashMap每次扩容进行double,最好能预估大小; 及时关闭Cursor; 耗时异步化; Android平台上数据库框架非常多,但是有一个共同特点就是基于对象关系映射...数据库框架设计 文章前面简单用代码进行数据库操作,我们可以从中看到一般在Android中操作数据库所需要对象有: SQLiteOpenHelper:数据库创建、更新操作对象SQLiteDatabase...提供数据库操作对象; 执行SQL 语句; 进行事务操作; 数据库关闭打开; public interface Database { Cursor rawQuery(String sql, String...但可以执行refresh更新,或者执行clearIdentityScope之后进行重新load。 数据库多线程并发操作 Android数据库多线程并发操作异常

1.4K30

android开发之使用SQLite数据库存储

onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。...onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧版本号和一个新版本号,这样你就可以清楚如何把一个数据库从旧模型转变到新模型。...false : true; 上面这段代码会返回一个 SQLiteDatabase实例,使用这个对象,你就可以查询或者修改数据库。...当你完成了对数据库操作(例如你 Activity 已经关闭),需要调用 SQLiteDatabase Close() 方法来释放掉数据库连接。...创建表和索引 为了创建表和索引,需要调用 SQLiteDatabase execSQL() 方法来执行 DDL 语句。如果没有异常,这个方法没有返回值。

2.5K20
领券