concurrent-database/ 对于 Android Dev 而言,有关 SQLite 的操作再经常不过了,相比你一定经历过控制台一片爆红的情况,这不禁让我们疑问:SQLite 到底是线程安全的吗?...保证 SQLIiteHelper 在无人使用时才断开连接 关于这个问题的解决 stackoveflow 上很多人建议我们:永远不要断开 SQLiteHelper 的连接,但是这样以来你会在 logcat...所以,我非常不建议你用这个方法。...同样的情况也发生在 closeDatabase() 方法中,当你每次调用该方法时,我们的 mOpenCounter 对象就会减一。当它减到 0 时,我们就去关闭这个数据库的连接。...Android 程序 OOM Android 让你的 Room 搭上 RxJava 的顺风车 从重复的代码中解脱出来 ViewModel 和 ViewModelProvider.Factory:ViewModel
对象,实际上你创建了新的数据库连接。...= DatabaseManager.getInstance();SQLiteDatabase database = manager.getDatabase()database.insert(…);database.close...,Thread1 和 Thread2 的 getDatabase() 方法都会返回同一个 SQLiteDatabase 对象实例。...SQLiteDatabase database = DatabaseManager.getInstance().openDatabase();database.insert(...);// database.close...每次我们调用这个方法的时候,计数器在减少,当减为 0 的时候,我们关闭数据库连接。 现在你能够使用你的数据库并且确保是线程安全的。 ----
数据库第1次创建时 则会调用,即 第1次调用 getWritableDatabase() / getReadableDatabase()时调用 // 在继承SQLiteOpenHelper类的子类中复写...数据库升级时自动调用 // 在继承SQLiteOpenHelper类的子类中复写 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion...具体使用 使用步骤 = 自定义数据库子类(继承SQLiteOpenHelper类)、创建数据库 & 操作数据库(增、删、查、改) 下面,我将逐一介绍每个步骤 3.1 自定义数据库子类(继承 SQLiteOpenHelper...() * 注:完成数据库操作后,记得调用close()关闭数据库,从而释放数据库的连接 */ sqliteDatabase.close(); /**...@Override public void onCreate(SQLiteDatabase db) { System.out.println("创建数据库和表");
int arg2) { } } 除了引入的包不一样了,其它的用法和传统的SQLiteOpenHelper都是完全相同的。...(); } }); } } 可以看到,在onCreate()方法中首先调用了SQLiteDatabase的loadLibs()静态方法将SQLCipher所依赖的so库加载进来,注意这里使用的是...然后我们创建了MyDatabaseHelper的实例,并调用getWritableDatabase()方法去获取SQLiteDatabase对象。...在添加数据按钮的点击事件里面,我们通过ContentValues构建了一条数据,然后调用SQLiteDatabase的insert()方法将这条数据插入到Book表中。...现在运行一下程序,先点击添加数据按钮,再点击查询数据按钮,刚刚添加的那条数据就应该在控制台里打印出来了。
在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。...SQLiteOpenHelper类的数据库操作方法介绍 方法名 作用 备注 onCreate() 创建数据库 创建数据库时自动调用 onUpgrade() 升级数据库 close() 关闭所有打开的数据库对象...SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。...SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase(); //关闭当前数据库 sqliteDatabase.close...因为你们的赞同/鼓励是我写作的最大动力!
二 SQLite数据库使用方法 创建数据库和表: 创建一个继承自SQLiteOpenHelper的子类,并实现它的构造方法、onCreate()和onUpgrade()等方法。...在onCreate()方法中,使用SQL语句创建数据库和表,例如:CREATE TABLE语句。 在构造方法中指定数据库名称、版本号和表结构等信息,并调用父类的构造方法。...关闭数据库: 在不再需要使用数据库时,通过调用close()方法来关闭数据库连接,例如:db.close()。 这些是SQLite数据库的基本使用方法。...onCreate(SQLiteDatabase db):当数据库第一次创建时调用,可以在其中执行创建表的操作。...然后,通过查询获取所有数据,并在控制台打印出每条数据的ID和名称。最后,通过调用dbHelper.close()关闭数据库连接。
首先要用一个类来继承SQLiteOpenHelper,并必须实现 public DatabaseHelper(Context context, String name, CursorFactory...factory, int version) { super(context, name, factory, version); } 具体类如下(关键地方我都加了注释...; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper...Context context, String name) { this(context, name, VERSION); } // 该函数第一次创建数据库的时候执行,实际上是在第一次得到...// TODO Auto-generated method stub System.out.println("update a database"); } } 调用代码如下
再学习数据库的相关操作前,我先给大家介绍一个类:SQLiteOpenHelper。SQLiteOpenHelper是Android系统为方便程序的开发引入的一个对数据库管理的工具类。...一般的用法是创建SQLiteOpenHelper的子类,并实现它的OnCreate方法和OnUpdate方法。...比如:下面是我定义的一个SQLiteOpenHelper的子类: public class MySQLiteOpenHelper extends SQLiteOpenHelper { /* *...; } //数据库升级时调用 @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { Log.i...* 一般情况下:getWritableDatabase和getReadableDatabase返回的都是可读可写的数据库 * 但是出错情况下:比如磁盘已满,则调用getReadableDatabase
Android系统推荐使用 SQLiteOpenHelper 的子类创建数据库,因此需要创建一个继承自SQLiteOpenHelper,并重写该类中的onCreate()方法和onUpgrade()方法即可...为什么要使用SQLiteOpenHelper的子类呢,因为SQLiteOpenHelper为抽象类(abstract),必须使用其子类进行继承,同时还需要重写父类的抽象方法,onCreate()方法和onUpgrade...需要注意的是,使用完SQLiteDatabase对象后定要调用close()方法关闭,否则数据库连接会一直存在,不断消耗内存,当系统内存不足时将获取不到SQLiteDatabase对象,并且会报出数据库未关闭异常...,new String[]{name}); db.close(); return number; } 在上述代码中,通过SQLiteDatebase对象db调用update()方法用来修改数据库中的数据...,new String[]{id}); db.close(); return number; } 从上述代码中可以看出,删除数据不同于增加和修改数据,因为删除数据不需要ContentValues
ListView对象的setAdapter()方法,参数:ListAdapter对象 定义内部类CallSmsSafeAdapter继承系统的BaseAdapter 实现四个方法,重要的有两个getCount()和getView...数据库操作 在db包下新建一个BlackNumberDBOpenHelper类继承SQLiteOpenHelper类 实现构造方法 调用父类的构造方法,super(),参数:上下文,数据库名称,游标工厂...(null),版本号(1) 重写onCreate()方法,传递进来参数SQLiteDatabase对象 调用SQLiteDatabase对象的execSQL()方法,参数:String的sql语句(例如...集合 查询全部 定义方法findAll(),查询全部数据 调用helper对象的getReadableDatabase()方法,获取到SQLiteDatabase对象 调用SQLiteDatabase对象的...,String[]参数值数组 调用SQLiteDatabase对象的close()方法,关闭数据库 CallSmsSafeActivity.java package com.qingguow.mobilesafe
综合来看,即轻量 兼容 多端 无需配置 无外部依赖 拥有简单易懂的API 安全 SQLiteDatabase和SQLiteOpenHelper SQLiteDatabase是Android SDK中操作数据库的核心类之一...oldVersion,int newVersion); image.png SQLiteOpenHelper中onCreate和onUpdate方法 SQLiteOpenHelper会自动检测数据库文件是否存在...也就是说oncreate()方法在数据库文件第一次创建时调用。 先看看SQLiteOpenHelper类的构造方法再解释onUpdate()方法何时会被调用。...总结一下oncreate()和onUpdate()调用过程: 如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后会调用oncreate()方法,在该方法中一般需要创建表、视图等组件...如果数据库文件存在,并且当前版本号高于上次创建或升级的版本号,SQLiteOpenHelper会调用onUpdate()方法,调用该方法后会更新数据库的版本号。
我将在这里说明安卓中该数据库的使用方法。这里只专注于安卓中SQLite数据库的接口使用,并没有深入关系型数据库和SQL语言的背景知识。 《雅典学院》是拉斐尔的画。...创建对象模型 在面向对象语言中,对象用于描述和操作数据。我使用两个类Category和Contact的对象: Category:联系人分类。包括id属性和name属性。 Contact:联系人。...安卓提供了一个类来实现相关的交互,即SQLiteOpenHelper。 SQLiteOpenHelper SQLiteOpenHelper是对象数据模型和关系型数据库的一个接口。...我需要覆盖该类的onCreate()和onUpgrade()方法,用于说明创建和升级时,数据库将采取的行动,比如在创建时新建数据库的表。...此外,我还编写了进行数据库操作的CRUD方法。这些方法的核心实际上是一些操作数据库的SQL语句。如果上面的CRUD方法无法满足数据库操作的需求,你还可以根据需要增加方法。
SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。 SQLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。...SQLiteOpenHelper 的子类,至少需要实现三个方法: 构造函数,调用父类 SQLiteOpenHelper 的构造函数。...调用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 实例,具体调用那个方法,取决于你是否需要改变数据库的内容...当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。...创建表和索引 为了创建表和索引,需要调用 SQLiteDatabase 的 execSQL() 方法来执行 DDL 语句。如果没有异常,这个方法没有返回值。
, onCreate()和onUpgrade(), 需重写,实现创建和升级数据库的逻辑。...构建SQLiteOpenHelper实例后, 再调用他的getReadableDatabase()/getWritableDatabase()方法就能创建数据库了 (数据库文件会存放在/data/data...()中, 执行Drop将原来的表删掉, 再重新调用onCreate()方法, 这样一开始的表和新加的表都会被创建; 调用onUpgrade(): 构造SQLiteOpenHelper实例的时候...SQLiteOpenHelper的两个实例方法getReadableDatabase()/getWritableDatabase() 会返回SQLiteDatabase对象, 借助这个对象就可对数据进行...price); }while (cursor.moveToNext()); } cursor.close
,SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们也必须在自己的类当中去重写这两个方法,分别在这两个方法中去实现创建和升级数据库的逻辑。 ...SQLiteOpenHelper当中有两个非常重要的实例化方法,getReadableDatabase()和getWritableDatabase(),这两个方法都可以创建或者而打开一个现有的数据库,入伙数据库已经存在就直接打开...cursor,一般传入都是null,第四个参数是当前数据库的版本号,这个额可以对数据库进行升级操作,构建出SQLiteOpenHelper实例之后再调用前面我们说的getReadableDatabase..., new String[]{"我在广州"}); //delete删除 //第一和表名,第二个参数是删除的条件,第三个参数是给约束条件赋值...,没和前面的更新道理相同 sqLiteDatabase.delete("Book","page > ?"
凡是点选或者下拉选择的界面,如果一旦选择完了无法回到不选择的情况,需要加上“清除选择”功能按钮 3.5 没有选择记录点击删除/修改按钮要提示“请先选择记录” 3.6 选择记录后点击删除按钮要提示“确实要删除吗?...(SQLiteDatabase.java:1950) > SQLiteOpenHelper( 2284): at > android.database.sqlite.SQLiteDatabase...而在关闭的同时,却没能及时的调用dismiss来解除对ProgressDialog等的引用,从而系统抛出了标题中的错误,而掩盖了真正导致这个错误的异常信息。...> window -> Preferences -> Android -> DDMS -> ADB connection time out(ms).把这个时间设置的长一些,默认是5秒即5000ms, 我改成...在开发的过程中经常在安装apk到模拟器上时会报出 ActivityManager: Error: Activity class {..} does not exist.
大家好,又见面了,我是你们的朋友全栈君。...Android数据库加密 一、简介 SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的读写效率、资源消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如Android...SQLCipher是完全开源的,其代码托管在github上。...为 net.sqlcipher.database.SQLiteDatabase android.database.SQLiteOpenHelper 为 net.sqlcipher.database.SQLiteOpenHelper...return list; } } 注意:SQLiteDatabase.loadLibs(context);这个千万别忘记调用 使用 private void queryData() {
LitePal的项目地址是:https://github.com/LitePalFramework/LitePal 传统的升级表方式 上一篇文章中我们借助MySQLiteHelper已经创建好了news...现在只需要调用如下代码,表就可以得到创建或升级了: [java] view plaincopy SQLiteOpenHelper dbHelper = new MySQLiteHelper(this,...现在调用以下代码来创建或升级数据库: [java] view plaincopy SQLiteOpenHelper dbHelper = new MySQLiteHelper(this, "demo.db...现在我们已经学习了新增表和新增列这两种升级方式,那么如果是某张表中的某一列已经没有用了,我想把这一列删除掉该怎么写呢?...那么有的朋友可能会问了,不是说SQLite不支持删除列的命令吗?那LitePal又是怎样做到的呢?
Exception e) { e.printStackTrace(); } finally { try { fos.close...因为文件流比较少用,我就讲到这里。 2、SharedPreferences简称Sp Sp是一种用xml文件存储数据的方式,下面我具体讲一下。...) { }} 这里写了三个方法,其中onCreate()和onUpgrade()方法为SQLiteOpenHelper中的抽象方法。...这两个方法暂时不区别 //SQLiteDatabase db = sqLiteOpenHelper.getWritableDatabase(); SQLiteDatabase db = sqLiteOpenHelper.getReadableDatabase...SQLite中可以调用DataBase对象的execSQL()方法,通过SQL语句完成大多数操作。具体Android中特有的操作后面我再讲。
类来方便在Android中操作数据库” ---- 1.SQLiteOpenHelper类的使用##### public abstract class SQLiteOpenHelper{} 源代码中的SQLiteOpenHelper...version 表示创建的数据库的版本; */ super(context, name, factory, version); } //数据库第一次创建时被调用...Log.d("MainActivity", "book price is :" + price); } while (cursor.moveToNext()); } cursor.close...比如说,我现在要查询Book表中的name和price列中的值,而且我要求查到的书名为《Android programming: the big nerd ranch guide》,不需要排序 ,则代码就如下编写...当然银 行肯定已经充分考虑到了这种情况,它会保证扣钱和收款的操作要么一起成功,要么都不会 成功,而使用的技术就是事务了。
领取专属 10元无门槛券
手把手带您无忧上云