Android使用getWritableDatabase()和getReadableDatabase()

数据库SQLite介绍

Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。

     getReadableDatabase()方法中会调用getWritableDatabase()方法

其中

getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。

getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。

  • 它会调用并返回一个可以读写数据库的对象
  • 在第一次调用时会调用onCreate的方法
  • 当数据库存在时会调用onOpen方法
  • 结束时调用onClose方法

4. 区别

是不是上面两个总结一样?
然后事实呢?

  1. 两个方法都是返回读写数据库的对象,但是当磁盘已经满了时,getWritableDatabase会抛异常,而getReadableDatabase不会报错,它此时不会返回读写数据库的对象,而是仅仅返回一个读数据库的对象。
  2. getReadableDatabase会在问题修复后继续返回一个读写的数据库对象。
  3. 两者都是数据库操作,可能存在延迟等待,所以尽量不要在主线程中调用。

创建与删除数据库

封装一个类去继承SQLiteOpenHelper  在构造函数中传入数据库名称与数据库版本号,

数据库被创建的时候会调用onCreate(SQLiteDatabase db) 方法,

数据库版本号发生改变的时候会调用 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 方法。

调用SQLiteOpenHelper  的 getReadableDatabase() 方法去创建数据库,如果数据库不存在则创建 并且返回SQLiteDatabase对象,如果数据库存在则不创建只返回SQLiteDatabase对象。

调用 deleteDatabase(DATABASE_NAME) 方法 传入数据库名称则可删除数据库。

封装了一个DatabaseHelper类继承SQLiteOpenHelper 我使用了设计模式中的单例模式来处理这个类,这里说一下单例模式 单例模式是常见的代码设计模式之一 它的好处是在于避免在内存中频繁的实例化所以将它的对象写成static 静态 这样它的对象就只有一份存在静态内存区使用的时候只须要通过getInstance()就可以直接拿到这个静态对象。

 1 public class DatabaseHelper extends SQLiteOpenHelper {
 2     private static DatabaseHelper mInstance = null;
 3
 4     /** 数据库名称 **/
 5     public static final String DATABASE_NAME = "xys.db";
 6
 7     /** 数据库版本号 **/
 8     private static final int DATABASE_VERSION = 1;
 9
10     /**数据库SQL语句 添加一个表**/
11     private static final String NAME_TABLE_CREATE = "create table test("
12         + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT,"+"hp INTEGER DEFAULT 100,"+ "mp INTEGER DEFAULT 100,"
13         + "number INTEGER);";
14
15     DatabaseHelper(Context context) {
16     super(context, DATABASE_NAME, null, DATABASE_VERSION);
17     }
18
19      /**单例模式**/
20     static synchronized DatabaseHelper getInstance(Context context) {
21     if (mInstance == null) {
22         mInstance = new DatabaseHelper(context);
23     }
24     return mInstance;
25     }
26
27     @Override
28     public void onCreate(SQLiteDatabase db) {
29     /**向数据中添加表**/
30     db.execSQL(NAME_TABLE_CREATE);
31     }
32
33     @Override
34     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
35     /**可以拿到当前数据库的版本信息 与之前数据库的版本信息   用来更新数据库**/
36     }
37
38
39     /**
40      * 删除数据库
41      * @param context
42      * @return
43      */
44     public boolean deleteDatabase(Context context) {
45     return context.deleteDatabase(DATABASE_NAME);
46     }
47 }  

在这个类中使用DatabaseHelper对象 实现创建与删除数据库、

 1 public class NewSQLite extends Activity {
 2     DatabaseHelper mDbHelper = null;
 3     SQLiteDatabase mDb = null;
 4     Context mContext = null;
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7     setContentView(R.layout.create_sql);
 8     mContext = this;
 9     //创建DatabaseHelper对象
10     mDbHelper = DatabaseHelper.getInstance(mContext);
11     //调用getReadableDatabase方法如果数据库不存在 则创建  如果存在则打开
12     mDb= mDbHelper.getReadableDatabase();
13
14     Button button0 = (Button)findViewById(R.id.createDateBase);
15     button0.setOnClickListener(new OnClickListener() {
16
17         @Override
18         public void onClick(View arg0) {
19
20         Toast.makeText(NewSQLite.this, "成功创建数据库", Toast.LENGTH_LONG).show();
21         }
22     });
23     Button button1 = (Button)findViewById(R.id.deleteDateBase);
24     button1.setOnClickListener(new OnClickListener() {
25
26         @Override
27         public void onClick(View arg0) {
28         mDbHelper = DatabaseHelper.getInstance(mContext);
29         // 调用getReadableDatabase方法如果数据库不存在 则创建 如果存在则打开
30         mDb = mDbHelper.getReadableDatabase();
31         // 关闭数据库
32         mDbHelper.close();
33         // 删除数据库
34         mDbHelper.deleteDatabase(mContext);
35         Toast.makeText(NewSQLite.this, "成功删除数据库", Toast.LENGTH_LONG).show();
36         }
37     });
38
39
40
41     super.onCreate(savedInstanceState);
42     }
43
44 }  

创建的数据库会被保存在当前项目中 databases 路径下

添加与删除数据库中的表

数据库是可以由多张数据表组成的 如果添加一张数据库的表的话 可以使用 数据库语句 create table 名称(内容) 来进行添加 。这里给出一条创建数据库的语句 。 意思是创建一张表 名称为gameInfo 表中包含的字段 为     _id  为INTEGER 类型 并且递增  name 为Text类型   hp mp 为INTEGER 默认数值为100 number 为INTEGER 类型。

增加 删除 修改 查询 数据库中的数据

使用SQLiteDatabase对象调用 insert()方法 传入标的名称与ContentValues 添加的内容 则可以向数据库表中写入一条数据 delete ()为删除一条数据 update()为更新一条数据。

我详细说一下查找一条数据使用的方法 query 中 跟了8个参数

public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);

参数说明:

table:数据库表的名称

columns:数据库列名称数组 写入后最后返回的Cursor中只能查到这里的列的内容

selection:查询条件

selectionArgs:查询结果

groupBy:分组列

having:分组条件

orderBy:排序列

limit:分页查询限制

Cursor:返回值,将查询到的结果都存在Cursor

Cursor是一个游标接口,每次查询的结果都会保存在Cursor中 可以通过遍历Cursor的方法拿到当前查询到的所有信息。

Cursor的方法


moveToFirst() //将Curor的游标移动到第一条
moveToLast()///将Curor的游标移动到最后一条
move(int offset)//将Curor的游标移动到指定ID
moveToNext()//将Curor的游标移动到下一条
moveToPrevious()//将Curor的游标移动到上一条
getCount() //得到Cursor 总记录条数
isFirst() //判断当前游标是否为第一条记录
isLast()//判断当前游标是否为最后一条数据
getInt(int columnIndex)    //根据列名称获得列索引ID
getString(int columnIndex)//根据索引ID 拿到表中存的字段

这里给出一个例子遍历Cursor的例子

 1    private void query(SQLiteDatabase db) {
 2 // 把整张表的所有数据query到cursor中
 3 Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
 4 //判断cursor不为空 这个很重要
 5 if (cursor != null) {
 6     // 循环遍历cursor
 7     while (cursor.moveToNext()) {
 8     // 拿到每一行name 与hp的数值
 9     String name = cursor.getString(cursor.getColumnIndex("name"));
10     String hp = cursor.getString(cursor.getColumnIndex("hp"));
11     Log.v("info", "姓名是 " + name + "hp为 " + hp);
12     }
13     // 关闭
14     cursor.close();
15 }
16    }  

原文地址:https://www.cnblogs.com/endv/p/12227742.html

时间: 2024-10-13 13:16:08

Android使用getWritableDatabase()和getReadableDatabase()的相关文章

Android getWritableDatabase()和getReadableDatabase区别

Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例. 其中getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库.如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象. getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁

getWritableDatabase()与getReadableDatabase()的区别:

getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能同样的 getReadableDatabase取得的实例也是具对数据库进行读和写的功能. 两者的区别在于 getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常) getReadableDatabase取得的实例是先调用getWritableDatabase以读写

getWritableDatabase()与getReadableDatabase()方法

一旦在程序中得到了SQLiteOpenHelper对象之后,程序无须使用SQLiteDatabase的静态方法创建SQLiteDatabase实例,而且可以使用getWritableDatabase()或getReadableDatabase()方法来获取一个用于操作数据库的SQLiteDatabase实例. getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错.

Android getReadableDatabase() 和 getWritableDatabase()

Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例.(getReadableDatabase()方法中会调用getWritableDatabase()方法) 其中getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错. getReadableDa

android开发之路09(浅谈SQLite数据库01)

1.SQLite数据库: SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使 用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下 - 只要确保 SQLite的二进制文件存在即可开始创建.连接和使用数据库. 对于SDK来讲,已经内置了SQLite的程序,因此我们不需要在SQLite官网上下载.一般数据库采用的都是静态的数据类 型,而我们的SQLite数据库采用的是动态数据库,会

Android 数据库读取数据显示 [5]

2016-12-1 课程内容 昨天学了Android数据库升级.降级.创建 今天把数据库表里面的数据读取出来显示到手机屏幕上 下面代码是MainActivity.java 的代码 package com.example.winxinmff; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;

第一行代码读书笔记——数据存储全方案,持久化技术

三种方式简单实现数据持久化功能 文件存储 简介 将数据存储到文件中 从文件中读取数据 扩展StringStringBuilderStringBuffer SharePreferences存储 注意点 获取SharePreferences对象的三种方式 Context类中的 getSharedPreferences方法 Activity类中的 getPreferences方法 PreferenceManager类中的 getDefaultSharedPreferences方法 向SharedPre

getReadableDatabase与getWritableDatabase的区别

在Android中,通过getReadableDatabase与getWritableDatabase()都可以获得一个可以对数据库进行操作的实例.然后都可以对数据库进行增.删.查.改.,但是两者也存在区别 1.getReadableDatabase是先以读写的方式打开数据库,但当数据库的磁盘满了时,就会打开失败,失败之后,程序会尝试以只读的形式打开数据库,如果能完成所需的任务,则只读的数据库就会关闭,返回一个读写的数据库对象. 2.getWritableDatabase同样也是以读写的方式打开

Android之SQLiteOpenHelper

1.SQLiteOpenHelper SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理.要使用它必须实现它的nCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)方法 onCreate:当数据库第一次被建立的时候被执行,例如创建表,初始化数据等. onUpgrade:当数据库需要被更新的时候执行,例如删除久表,创建新表. 2.实现代码 [java] view plaincopy <EMBED id=Zer