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

mac2022-06-30  99

一 创建数据库

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);

 

转载于:https://www.cnblogs.com/Mask-D/p/9507172.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)