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, " +
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

建议

当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

Android高级技术大纲

面试资料整理

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

[外链图片转存中…(img-fPjzkHnC-1713752432474)]

[外链图片转存中…(img-xAYkvbRP-1713752432475)]

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值