Android数据存储——SQLite数据库存储

一 创建数据库

1.创建一个 “数据库管理器” 实体类来继承 SQLiteOpenHelper抽象类。其中需要重写两个方法用于创建数据库和升级数据库:onCreate()和onUpgrade()。

2.数据库管理器的构造方法接收四个参数。第一个是context(环境),第二个是数据库名,第三个是查询数据返回的自定义的cursor、一般都是null,第四个是数据库的版本号。

3.数据库管理器实例的两种方法,getReadableDatabase()和getWritableDatabase()。这两个都可以创建或打开一个数据库,没有的时候创建,存在的时候直接打开就行操作。(当数据库不可以写入的时候read以只读方式打开,而write方式会出错。)

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

总的来说、将管理器传入四个参数实例化后就可以通过Read或write两种方法对数据库进行操作了。

创建一个BookStore.db数据库,其中新建Book表

1 create table Book(
2     id integer primary key autoincrement,
3     author text,
4     price real,
5     pages integer,
6     name text)

这是SQL语句,代码如下:

特别注意,在写SQL语句转换为字符串常量的时候,一定要记得写“,”和“()”。

 1 public class MyDatabaseHelper extends SQLiteOpenHelper {
 2 
 3     /*建表语句定义成了一个字符串常量*/
 4     public static final String CREATE_BOOK =
 5             "create table Book("
 6                     + "id integer primary key autoincrement,"
 7                     + "author text,"
 8                     + "price real,"
 9                     + "pages integer,"
10                     + "name text)";
11 
12     private Context mContext;
13 
14     /*数据库管理器构造方法*/
15     public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
16         super(context, name, factory, version);
17         mContext = context;
18     }
19 
20     /*创建数据库,同时创建表*/
21     @Override
22     public void onCreate(SQLiteDatabase db) {
23         db.execSQL(CREATE_BOOK);
24         Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_LONG).show();
25     }
26 
27     /*升级数据库*/
28     @Override
29     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
30     }
31 }

在布局中写一个创建按钮,然后MainActivity中的代码如下:

 1 public class MainActivity extends AppCompatActivity {
 2 
 3     private MyDatabaseHelper dbHelper;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9 
10         dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
11         Button createDatabase = (Button) findViewById(R.id.create_database);
12         createDatabase.setOnClickListener(new View.OnClickListener() {
13             @Override
14             public void onClick(View view) {
15                 dbHelper.getWritableDatabase();
16             }
17         });
18     }
19 }

如上,先实例化数据库管理器,在构造函数中传入相关参数,然后在点击事件中调用实例的 getWritableDatabase()方法。

注,因为需要用android6,0版本才能有root权限,所以用的是android6,0的虚拟机,而如果出现“waiting for target device to come online”的提示并一直打不开虚拟器,则是sdk的版本与虚拟器不适配,通过sdk manager打开。

然后选择对应虚拟器的 API level。如下: 然后再启动就成功了。

可以打开命令行来查看数据库创建情况,

  • 步骤 1 adb shell。
  • 步骤 2 通过cd 进入到 /data/data/com,example.databasetest/databases/目录下
  • 步骤 3 通过sqlite3 加上数据库名加入数据库
  • 步骤 4 输入 .table 查看数据库中所有的表。

 

二 升级数据库

如我们想在数据库中添加一张新的表 SQL语句如下:

1 create table Category(
2     id integer primary key autoincremet,
3     category_name text,
4     category_code integer)

同样将这句话加入到数据库管理器中,作为一个字符串常量,然后在onCreate()中创建这个表。

但是!因为数据库已经存在了,所以不会再调用onCreate()方法,就无法得到创建,所以需要在更新数据库的onUpgrade()方法中先将两张表删除,再调用onCreate()方法。注意要调用到更新方法时需要在构造函数中将传入的版本号升级。

数据库管理器代码如下:

 1 public class MyDatabaseHelper extends SQLiteOpenHelper {
 2 
 3     /*建表语句定义成了一个字符串常量*/
 4     public static final String CREATE_BOOK =
 5             "create table Book("
 6                     + "id integer primary key autoincrement,"
 7                     + "author text,"
 8                     + "price real,"
 9                     + "pages integer,"
10                     + "name text)";
11 
12     public static final String CREATE_CATEGORY =
13             "create table Category("
14                     + "id integer primary key autoincrement,"
15                     + "category_name text,"
16                     + "category_code integer)";
17 
18     private Context mContext;
19 
20     /*数据库管理器构造方法*/
21     public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
22         super(context, name, factory, version);
23         mContext = context;
24     }
25 
26 
27     /*创建数据库,同时创建表*/
28     @Override
29     public void onCreate(SQLiteDatabase db) {
30         db.execSQL(CREATE_BOOK);
31         db.execSQL(CREATE_CATEGORY);
32         Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_LONG).show();
33     }
34 
35     /*升级数据库*/
36     @Override
37     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
38         db.execSQL("drop table if exists Book");
39         db.execSQL("drop table if exists Category");
40         onCreate(db);
41     }
42 }

查看命令行:证明创建成功。

三 添加数据( insert()方法 )

因为之前说的 getReadableDatabase()方法和 getwritableDatabase()方法会返回一个SQLiteDatabase对象。所以对这个对象用insert()方法即可添加数据。

insert()方法接收三个参数:

  • “表名”
  • “默认空值”
  • “传入组装好的数据values”

而其中用到的contentvalues数据类型则是用来组装传入内容的。相当于一个map组,用put来压入数据。用完后要记得clear();代码如下:

 1         /*插入数据,insert方法传入三个参数,“表名”“默认空值”“传入组装好的数据values”*/
 2         Button addData = (Button) findViewById(R.id.add_data);
 3         addData.setOnClickListener(new View.OnClickListener() {
 4             @Override
 5             public void onClick(View view) {
 6                 SQLiteDatabase db = dbHelper.getWritableDatabase();
 7                 /*用contentValues来组装要插入的数据 未赋值的自动生成默认值*/
 8                 ContentValues values = new ContentValues();
 9 //                开始组装第一组数据
10                 values.put("name", "The da vi code");
11                 values.put("author", "Dan");
12                 values.put("pages", 434);
13                 values.put("price", 13.33);
14                 db.insert("Book", null, values);//输入第一行数据
15                 values.clear();//清空values。
16 
17 //                开始组装第二条数据
18                 values.put("name", "The lost");
19                 values.put("author", "mask");
20                 values.put("pages", 12);
21                 values.put("price", 999);
22                 db.insert("Book", null, values);//输入第二行数据
23                 values.clear();//清空values。
24             }
25         });

四 更新数据 ( update()方法 )

更新方法类似于新增数据的方法,使用的是update()方法,传入四个参数,分别是:

  • “表名”
  • “contentvalues值 修改的内容值”
  • “SQL语句中的where约束条件”
  • “where中的具体限定值”

同样将要改变的数据压入contentvalues中,然后传入。代码如下:

 1         /*更新数据,使用update方法,传入四个参数,
 2         “表名”“修改的内容值”“SQL语句中的where”“where中的具体限定值”*/
 3         Button updateData = (Button) findViewById(R.id.update_data);
 4         updateData.setOnClickListener(new View.OnClickListener() {
 5             @Override
 6             public void onClick(View view) {
 7                 SQLiteDatabase db = dbHelper.getWritableDatabase();
 8                 ContentValues values = new ContentValues();
 9                 values.put("price", 1.2);
10                 db.update("Book", values, "name=?", new String[]{"The da vi code"});
11             }
12         });

五 删除数据 ( delete()方法 )

使用delete()方法,不需要用content数据来传数据,因为只需要指定相应的数据进行删除即可。delete()方法传入三个参数:

  • “表名”
  • “SQL语句中的where约束条件”
  • “where中的具体限定值”

具体的代码如下:

 1         /*删除数据,使用delete方法,传入三个参数,
 2         * “表名”“SQL语句中的where”“where中的具体限定值”*/
 3         Button deleteButton = (Button) findViewById(R.id.delete_data);
 4         deleteButton.setOnClickListener(new View.OnClickListener() {
 5             @Override
 6             public void onClick(View view) {
 7                 SQLiteDatabase db = dbHelper.getWritableDatabase();
 8                 db.delete("Book", "pages>?", new String[]{"20"});
 9             }
10         });

六 查询数据( query()方法 )

查询方法比较复杂,其中要传入的参数较多,就最短的一个也要传入七个参数。如下

同时需要用到cursor对象(光标)来输出查询结果,将查询结果赋给cursor对象,得到的cursor对象。

接着调用他的moveToFirst()方法将数据指针移动到第一行开始,然后加入循环,遍历每一行数据,通过moveToNext()来进行跳转。

通过cursor的getColumnIndex()方法获得某一列在表中位置索引,然后将索引传入相应的取值方法中,得到对应的数据。使用完后需要将cursor通过close关闭。

代码如下:

 1         /*查询数据,使用query方法,传入参数较多。*/
 2         Button queryButton = (Button) findViewById(R.id.query_data);
 3         queryButton.setOnClickListener(new View.OnClickListener() {
 4             @Override
 5             public void onClick(View view) {
 6                 SQLiteDatabase db = dbHelper.getWritableDatabase();
 7                 //查询book中所有数据
 8                 Cursor cursor = db.query("Book", null, null, null, null, null, null);
 9                 if (cursor.moveToFirst()) {
10                     do {
11                         //遍历cursor对象 取出数据并打印
12                         String name = cursor.getString(cursor.getColumnIndex("name"));
13                         String author = cursor.getString(cursor.getColumnIndex("author"));
14                         int pages = cursor.getInt(cursor.getColumnIndex("pages"));
15                         double price = cursor.getDouble(cursor.getColumnIndex("price"));
16                         Log.d("MainActivity", "book name is " + name);
17                         Log.d("MainActivity", "book author is " + author);
18                         Log.d("MainActivity", "book pages is " + pages);
19                         Log.d("MainActivity", "book price is " + price);
20                     }while (cursor.moveToNext());
21                 }
22                 cursor.close();
23             }
24         });

 七 原生方法 (原SQL语句)

 1 // 添加数据的方法如下:
 2 db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)", new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" }); 
 3 db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)", new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });
 4 
 5 // 更新数据的方法如下:
 6 db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99", "The Da Vinci Code" });
 7 
 8 // 删除数据的方法如下:
 9 db.execSQL("delete from Book where pages > ?", new String[] { "500" });
10 
11 // 查询数据的方法如下:
12 db.rawQuery("select * from Book", null);

猜你喜欢

转载自www.cnblogs.com/Mask-D/p/9507172.html