Android 存储数据之3 使用SQLite数据库存储

// 创建数据库

// mydata = new MyDatabaseHelper(MainActivity.this, “BookStore.db”,

// null,1);

// 第二次执行这条语句,数据库版本是2,会执行到onUpgrade()

dbHelper = new MyDatabaseHelper(MainActivity.this, “BookStore.db”, null,

2);

create_database = (Button) findViewById(R.id.create_database);

add_data = (Button) findViewById(R.id.add_data);

update_data = (Button) findViewById(R.id.update_data);

delete_data = (Button) findViewById(R.id.delete_data);

query_data = (Button) findViewById(R.id.query_data);

replace_data = (Button) findViewById(R.id.replace_data);

// 创建表

create_database.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

dbHelper.getWritableDatabase(); // 获取可读写的数据库

}

});

//添加数据

add_data.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 获得数据库实例,用来操作的

SQLiteDatabase db = dbHelper.getWritableDatabase();

// 这是ContentValues对象insert()方法的第三个参数,用来组装数据的

ContentValues values = new ContentValues();

// id那一列是自增长的,就不用设置

// 开始组装第一条数据

values.put(“name”, “The Da Vinci Code”); // 达芬奇密码

values.put(“author”, “Dan Brown”);

values.put(“pages”, 454);

values.put(“price”, 16.96);

db.insert(“Book”, null, values); // 插入第一条数据

values.clear(); // 清空values中的数据

values.put(“name”, “The Lost Symbol”);

values.put(“author”, “Dan Brown”);

values.put(“pages”, 510);

values.put(“price”, 19.95);

db.insert(“Book”, null, values); // 插入第二条数据

}

});

//更新数据

update_data.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

SQLiteDatabase db = dbHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put(“price”, 10.99);

// 参数:表名,ContentValues对象封装的数据,更新哪一行(去更新name=?,而?占一个占位符),可以通过

// 第四个参数提供的一个字符串数组为第三个参数中的每个占位符指定相应的内容.

// 第三个参数对应sql语句的where部分

int count = db.update(“Book”, values, “name = ?”,

new String[] { “The Da Vinci Code” });

// 上述代码的意图是,将名字为"The DaVinci Code"的这本书价格改成10.99

}

});

//删除数据

delete_data.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

SQLiteDatabase db = dbHelper.getWritableDatabase();

//表名,where部分,?

//删除大于500页的书

db.delete(“Book”, “pages > ?”, new String[]{“500”});

}

});

//查询数据

query_data.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//调用query()方法后悔返回一个Cursor对象,查询到的所有数据都将从这个对象中取出

SQLiteDatabase db = dbHelper.getWritableDatabase();

//参数:表名,列名,where部分,为占位符指定具体的值,group by的列,对group by后的结果进一步约束,查询结果排序方式

//查询Book表中的所有数据,并存到Cursor对象中

Cursor cursor = db.query(“book”, null, null, null, null, null, null, null);

//moveToFirst()方法将数据的指针移动到第一行的位置,然后循环查询每一行的数据

//通过Cursor的getColumnIndex()方法获取到某一列在表中对应位置索引

//然后再将这个索引传入到相应的取值方法中,就可以得到从数据库中读取到的数据了

//最后需要用close()方法关闭Cursor

if(cursor.moveToFirst()){

do{

String name = cursor.getString(cursor.getColumnIndex(“name”));

String author = cursor.getString(cursor.getColumnIndex(“author”));

int pages = cursor.getInt(cursor.getColumnIndex(“pages”));

double price = cursor.getDouble(cursor.getColumnIndex(“price”));

Log.d(“xfhy”,“name :”+name);

Log.d(“xfhy”,“author :”+author);

Log.d(“xfhy”,“pages :”+pages);

Log.d(“xfhy”,“price :”+price);

}while(cursor.moveToNext());

}

cursor.close();

}

});

//使用事务,替换数据 要么删除旧数据和添加新数据的操作一起完成,要么就还要保留原来的旧数据

//事务的特性就是保证让某一系列操作要么全部完成,要么一个都不会完成

//这里是事务的标准写法

replace_data.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

SQLiteDatabase db = dbHelper.getWritableDatabase();

db.beginTransaction(); //开启事务

try {

db.delete(“Book”, null, null); //这里表示删除Book表里的全部数据

/*if(true){ //这里是故意让事务失败的,为了测试

throw new NullPointerException(); //手动抛出异常,让事务失败

}*/

ContentValues values = new ContentValues();

values.put(“name”, “Game of Thrones”);

values.put(“author”, “George Martin”);

values.put(“pages”, 720);

values.put(“price”, 20.85);

db.insert(“Book”,null,values); //添加数据

db.setTransactionSuccessful(); //事务已成功执行

} catch (Exception e) {

e.printStackTrace();

} finally {

db.endTransaction(); //结束事务

}

}

});

}

}

继承SQLiteOpenHelper,并完成构造方法的实现,实现onCreate()和onUpgrade()方法

建表语句,integer是整型,text是文本,real是浮点型,blob是二进制类型

用adb命令去打开数据库目录的话,需要将platform-tools配置到Path环境变量中去.然后cmd->adb shell

打开数据库所在目录/data/data/com.example.databasetest/databases

再ls 可以看到当前的数据库BookStore.db已经在里面了,输入sqlite3 BookStore.db

可以用sqlite3工具打开数据库,然后输入.schema可以显示当前数据库的创建的语句

这里是升级数据库的最佳写法:

用户是第一次安装这个软件,则建立2张表

用户是升级数据库,则判断一下是不是通过老版本来更新的,只需要创建1张表Category即可

这里升级数据库时,没有break语句,这是为了保证每一次的数据库修改都能被全部执行到.

比如我现在是数据库版本1,我安装了最新的软件,就需要升级到数据库版本3,就需要做1->2,2->3的所有操作

public class MyDatabaseHelper extends SQLiteOpenHelper{

//存放书的各种详细数据

private static final String CREATE_BOOK = “create table Book(” +

"id integer primary key autoincrement, " +

结语

网上高级工程师面试相关文章鱼龙混杂,要么一堆内容,要么内容质量太浅, 鉴于此我整理了上述安卓开发高级工程师面试题以及答案。希望帮助大家顺利进阶为高级工程师。
目前我就职于某大厂安卓高级工程师职位,在当下大环境下也想为安卓工程师出一份力,通过我的技术经验整理了面试经常问的题,答案部分是一篇文章或者几篇文章,都是我认真看过并且觉得不错才整理出来。

大家知道高级工程师不会像刚入门那样被问的问题一句话两句话就能表述清楚,所以我通过过滤好文章来帮助大家理解。

1307页字节跳动Android面试真题解析火爆全网,完整版开放下载

现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套【Android进阶学习视频】、【全套Android面试秘籍】、【Android知识点PDF】。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
面试经常问的题,答案部分是一篇文章或者几篇文章,都是我认真看过并且觉得不错才整理出来。

大家知道高级工程师不会像刚入门那样被问的问题一句话两句话就能表述清楚,所以我通过过滤好文章来帮助大家理解。

[外链图片转存中…(img-hs9tl0ET-1714680944088)]

现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套【Android进阶学习视频】、【全套Android面试秘籍】、【Android知识点PDF】。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值