SQLite数据存储

这里需要说明的是,要使用这种存储,在开发的时候最好是使用模拟器或者把真机root,不然没有权限访问数据库所在的位置、po主直接把三星的s4用刷机大师刷成了别的系统,顺便root掉了。

sqlite是轻量级的数据库,安卓内置的,不需要账户密码就可以使用,对于数据量大,结构复杂的数据,使用ShareedPreference都不太方便。

SQLite语法

当然,sqlite有自己特定的语法和数据类型,例如real(浮点),text(文本)等,使用sqlite需要一个帮助类:

SQLiteOpenHelper

这个类是个抽象类,需要我们自己创建一个类去实现它并且重写相关的方法,一个是onCreate(),一个是onUpgrade()

还有两个重要的方法,用于打开数据库并返回一个SQLiteDatabase,数据库的CRUD操作需要通过这个SQLiteDatabase对象进行,如果存在直接打开否则创建一个新的数据库。

1、getReadableDatabase()2、getWritebleDatabase()//当数据库不可写入的时候使用这个方法会抛异常

一般新建表的操作写在onCreate()里面,例如:

@Override
public void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);Toast.makeText(mContext,"创建成功",Toast.LENGTH_SHORT).show();
}

使用时,myDatabaseHelper = new MyDatabaseHelper(this,"book.db",null,1);
就可以得到一个MyDatabaseHelper对象,MyDatabaseHelper的构造方法中有四个参数,第一个是Context对象,第二个是数据库的名字,最后一个是版本号,如果数据库名不变的话,onCreate()只会执行一次,此时只有通过改变版本号,使其回调onUpgrade()方法,才能对这个数据库进行升级,例如要本来数据库里有一张book表,要新添加一张category表,则可以:

@Override
public void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);db.execSQL(CREATE_CATEGORY);Toast.makeText(mContext,"创建成功",Toast.LENGTH_SHORT).show();}@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("drop table if exists Book");db.execSQL("drop table if exists Category");onCreate(db);
}

之前的版本号参数改成比1大的数就可以触发onUpgrade()方法。

如果想知道数据库是否创建成功,需要进入/data/data/com.jackie.databasetest/databases查看

D:\DevelopKit\Android\AndroidProjects\DatabaseTest>adb root
adbd is already running as rootD:\DevelopKit\Android\AndroidProjects\DatabaseTest>adb shellroot@ja3g:/data/data/com.jackie.databasetest/databases # ll
-rw-rw---- u0_a64   u0_a64      24576 2015-11-11 21:42 book.db
-rw-rw---- u0_a64   u0_a64       8720 2015-11-11 21:42 book.db-journal

可以看到有存在book.db文件
查看它需要sqlite3中的相关指令,.table可以查看表,.schema可以查看表结构。。。

root@ja3g:/data/data/com.jackie.databasetest/databases # sqlite3 book.db
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table
Category          android_metadata  book

可以看到这里有两个表,就是之前新建的,不过此时都是空表,里面没有数据。

CRUD操作,是数据库的核心,也是开发应用的业务主体

添加数据(Create)

添加一个按钮用于添加数据
直觉告诉我们,添加数据应该是通过SQLiteDatabase的方法实现

insert(String table, String nullColumnHack, ContentValues values)

可以看到,这个方法第一个参数很容易想到是操作的表名,第二个不用管,第三个参数是一个ContentValues对象,其实这个对象就相当于一条数据,通过key-value的形式为key字段赋值,例如要添加两本书,如果要重复使用同一个ContentValues对象,则要记得插入后clear一下再重新put数据

            case R.id.btnAdd:SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();ContentValues book = new ContentValues();book.put("name","无声告白");book.put("price",17.15);book.put("pages",290);book.put("author", "伍绮诗");db.insert("book", null, book);book.clear();book.put("name","年少荒唐");book.put("price",18.00);book.put("pages",323);book.put("author", "朱炫");db.insert("book", null, book);break;```
sqlite> select * from book;
1|伍绮诗|17.15|290|无声告白
2|朱炫|18.0|323|年少荒唐         

可以看到book表中已经有了刚刚添加的两本书

删除数据(Delete)

同样看看SQLiteDatabase中的方法

    public int delete(String table, String whereClause, String[] whereArgs) {acquireReference();try {SQLiteStatement statement =  new SQLiteStatement(this, "DELETE FROM " + table +(!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs);try {return statement.executeUpdateDelete();} finally {statement.close();}} finally {releaseReference();}}

可以看到,第一个参数仍然是表名,第二个参数是条件,第三个参数是条件的边界

那么我要删除掉id为3的数据
可以这么写

            case R.id.btnDel:db.delete("book","id=?",new String[]{"3"});break;

更改数据(Update)

    /*** Convenience method for updating rows in the database.** @param table the table to update in* @param values a map from column names to new column values. null is a*            valid value that will be translated to NULL.* @param whereClause the optional WHERE clause to apply when updating.*            Passing null will update all rows.* @param whereArgs You may include ?s in the where clause, which*            will be replaced by the values from whereArgs. The values*            will be bound as Strings.* @return the number of rows affected*/public int update(String table, ContentValues values, String whereClause, String[] whereArgs) {
        return updateWithOnConflict(table, values, whereClause, whereArgs, CONFLICT_NONE);}

可以看到我们需要一个ContentValues对象,和一个约束条件(更新哪一条数据)

例如更新id为1的书的价格为20.00

            case R.id.btnUp:ContentValues update = new ContentValues();update.put("price",20.00);db.update("book",update,"id=?",new String[]{"1"});
sqlite> select * from book;
1|伍绮诗|20.0|290|无声告白
2|朱炫|18.0|323|年少荒唐        

查询数据(Retrieve)

查询数据的方法,返回的是一个Cursor,通过遍历Cursor就可以得到每一条数据的内容。
这里是通过

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

来查询,各个参数的含义比较明显可以看出来,为了这里我们进行全表查询

            case R.id.btnRe:Log.v("jackie","查询数据");Cursor cursor = db.query("book",null,null,null,null,null,null,null);//遍历Cursor,用Log打印数据if(cursor.moveToFirst()){do{String name = cursor.getString(cursor.getColumnIndex("name"));String author = cursor.getString(cursor.getColumnIndex("author"));double price = cursor.getDouble(cursor.getColumnIndex("price"));int pages = cursor.getInt(cursor.getColumnIndex("pages"));Log.v("jackie", "name is" + " " + name);Log.v("jackie", "author is" + " " + author);Log.v("jackie", "price is" + " " + price);Log.v("jackie", "pages is" + " " + pages);}while(cursor.moveToNext());}break;
11-11 23:19:20.176 12846-12846/? V/jackie: 查询数据
11-11 23:19:20.181 12846-12846/? V/jackie: name is 无声告白
11-11 23:19:20.181 12846-12846/? V/jackie: author is 伍绮诗
11-11 23:19:20.181 12846-12846/? V/jackie: price is 20.0
11-11 23:19:20.181 12846-12846/? V/jackie: pages is 290
11-11 23:19:20.181 12846-12846/? V/jackie: name is 年少荒唐
11-11 23:19:20.181 12846-12846/? V/jackie: author is 朱炫
11-11 23:19:20.181 12846-12846/? V/jackie: price is 18.0
11-11 23:19:20.181 12846-12846/? V/jackie: pages is 323

日报2015/11/11(第一行代码读书笔记)相关推荐

  1. 日报2015/11/17(第一行代码读书笔记)

    ContentResolver 使用内容提供器是Android实现跨程序共享数据的标准方式. 基本用法 这里要访问的是通讯录,里面已经有一个系统自己的ContentProvider 数据查询无非是要最 ...

  2. 第一行代码读书笔记1+常见错误分析

    1.eclipse里面的视图在 windows ---- show views ---- other ----- Android 2.需要掌握Logcat的使用 Logcat是你在茫茫人海中寻找到一片 ...

  3. 第一行代码读书笔记(Chapter2 探究新语言,快速入门Kotlin编程)

    准确来说,Java是解释性语言,Kotlin能被编译为class文件,再在虚拟机中运行 Kotlin几乎杜绝了空指针异常 运行Kotlin代码:IDEA创建Kotlin项目:在线运行kotlin代码: ...

  4. 第一行代码读书笔记3+错误分析

    as中怎么删除项目 file---project structure 然后点击左边的 + 与 - 进行删除. 参考资料:http://jingyan.baidu.com/article/c74d600 ...

  5. 第一行代码阅读笔记---基本知识

    在res中,我们会看到很多目录,分别如下: drawable-hdpi drawable-ldpi drawable-mdpi drawable-xxhdpi layout menu values v ...

  6. 从零开始写安卓APP 《第一行代码》笔记 第一周

    这是软件开发课的任务,本人其实不会java也不会安卓开发.以前只做过web端,因为某课程的爆炸实验单人撸了全栈.不过好在很早前就想学了,这里记录一下过程.放的主要是<第一行代码>的一些笔记 ...

  7. 第一行代码学习笔记第六章——详解持久化技术

    知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...

  8. 第一行代码学习笔记第八章——运用手机多媒体

    知识点目录 8.1 将程序运行到手机上 8.2 使用通知 * 8.2.1 通知的基本使用 * 8.2.2 通知的进阶技巧 * 8.2.3 通知的高级功能 8.3 调用摄像头和相册 * 8.3.1 调用 ...

  9. 第一行代码学习笔记第七章——探究内容提供器

    知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...

最新文章

  1. Device Tree(二):基本概念
  2. [转]GridView导出Excel总结
  3. CG-CTF-Web-SQL注入1
  4. 【渝粤教育】国家开放大学2018年春季 8634-21TAndroid智能手机编程 参考试题
  5. 如何在手机上安装Ubuntu Touch 13.10
  6. 微软力挺 Go,宣布参与 Athens 项目和 GopherSource
  7. css3中transform-style的用法详解
  8. android 新建签名文件注意事项
  9. Windows10 adb安装与环境变量配置
  10. python cad模块_Python cad包_程序模块 - PyPI - Python中文网
  11. 操作系统 进程调度实验报告
  12. 【论文泛读】Leveraging Distribution Alignment via Stein Path for Cross-Domain Cold-Start Recommendation
  13. Vue和ElementUI第二天
  14. Nacos本地进行了远程配置而远程未配置相关信息而导致应用报内存泄漏问题的异常
  15. 微信小程序授权订阅消息判断用户取消或允许
  16. CAD编辑指南4:新建空白图纸以及添加文字标注
  17. rpm和yun的使用方法
  18. [ 数据通信面试篇 ] 数通面试题大集合(详解),看完直怼面试官(一)
  19. 洛谷4895 BZOJ3162 独钓寒江雪 树形dp 树哈希
  20. 钢管切割 2018-2-5

热门文章

  1. local cell id和cell id区别
  2. “优必选“杯2021中国机器人技能大赛--赛后总结
  3. X Window系统
  4. 亲爱的老狼-绝对路径、相对路径
  5. 机器视觉(相机、镜头、光源)详细解析
  6. VS2017生成项目报 找不到资产文件“xxxx\obj\project.assets.json
  7. 2018数据结构课程设计报告
  8. 送给刚入职 有压力和迷茫的你
  9. 访问网络中的计算机密码忘了怎么办,忘记wifi密码怎么办,用这招可以知道电脑中的wifi密码...
  10. python 删除文件夹下面的所有文件python删除文件夹下面的所有文件夹及子文件