前几天学习了Android中的数据存储,包括文件存储,SharedPreferences存储,还有就是Acndroid中的特色:SQLite数据库存储了。让我比较惊讶的是Android中竟然内嵌了一个轻量型的数据库SQLite数据库,使得本地的数据持久化有了一个质的飞跃。

通过前两天上课听老师讲解,和课下自己看书总结,想在博客上把自己对于SQLite数据库的理解做一下总结,也是方便之后的复习。Android为了让我们能够更加方便的管理数据库,专门提供了SQLiteOpenHelper帮助类,这个类是一个抽象类,在这个类中,有两个抽象方法,一个是onCreate(),一个是onUpdate(),我们必须在自己的帮助类中继承SQLiteOpenHelper,并实现这两个抽象方法,并分别在这两个抽象方法中完成表的创建和数据库的更新和维护。SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()和getWriteableDatabase()。这两个方法都可以打开或创建一个现有的数据库(若数据库已经存在久直接打开,否则创建一个新的数据库),并返回一个可对数据库进行操作的对象。不同的是,当数据库不可以写入的时候(如磁盘空间已满),getReadableDatabase()方法返回的对象以只读的方式打开数据库,而getWriteableDatabase()方法出现异常(正如常常情况下使用二者获得的对象都具有读写功能)。SQLiteOpenHelper有两个构造方法可以重写,这里我们选择参数少的那一个。这个构造方法里面接收4个参数,第一个参数Context,这个没什么好说的,代表上下文,必须要有它才能对数据库进行操作;第二个参数是数据库名,他代表我们将要创建的数据库的名字;第三个参数允许我们创建数据库的时候返回一个自定义的Curs o r,一般都是传入nu ll;第四个参数代表当前数据库的版本号,可以用于数据库升级操作

构建出SQLiteOpenHelper实例后,再调用它的getReadableDatabase()或着getWriteableDatabase()方法就可以创建出数据库了,数据库文件会存放在/data/data/<package name >/databases目录下。此时重写的onCreate方法也会执行,通常在里面完成一些表的创建操作。

SQLite数据库不像其他数据库拥有众多繁杂的数据类型,它的常用的数据类型很简单:integer代型,real代表浮点型,text代表文本型,blob代表二进制类型。

由于创建好的数据库虽然能在File Explorer中看到, 但却不能看到其内部包含的表,还有表中的数据,所以我们在这里使用adb shell来查看,使用adb shell需要配置adb的环境变量在这里不再叙述,网上有简单的教程。配置好环境变量后,Win+R中输入cmd进入命令提示符模式,输入adb shell进入adb环境,然后输入命令:cd /data/data/<package name >/databases进入到该目录下,输入ls来查看目录下的文件,此时输入sqlite3+数据库名即进入sql编辑模式。键入.table可以查看数据库中有哪些表,键入.schema命令可以查看建表语句。(在sqlite编辑模式下每句语句后面都要有';'结束)。下面通过一个小Demo来讲解SQLi te数据库中的CRUD操作以及数据库的一些其他需要注意的地方。

首先创建我们自己的SQLOpenHelper类继承自SQLiteOpenHelper,并重写其中的方法和构造函数:

 package com.example.databasetest;

 import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; public class SqlOpenHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table book("
+ "id integer primary key autoincrement, "
+ "name text,"
+ "price real)";
public SqlOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_BOOK);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
} }

可以看到我们在重写的onreate方法中调用SQLiteDatbas的execSQL()方法建了一个表book

然后在我们的主界面中添加了四个按钮,用于创建数据库病完成CRUD操作:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="CREATE_BOOK"/>
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="update"/>
<Button
android:id="@+id/btn3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="delete"/>
<Button
android:id="@+id/btn4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="select"/>
</LinearLayout>

activity_main

我们在MainActivity中注册并实例化了四个按钮,并注册按钮的监听事件:

 1 package com.example.databasetest;
2
3 import android.app.Activity;
4 import android.content.ContentValues;
5 import android.database.Cursor;
6 import android.database.sqlite.SQLiteDatabase;
7 import android.os.Bundle;
8 import android.util.Log;
9 import android.view.View;
10 import android.view.View.OnClickListener;
11 import android.widget.Button;
12 import android.widget.Toast;
13
14 public class MainActivity extends Activity implements OnClickListener {
15
16 private Button btn1,btn2,btn3,btn4;
17 private SqlOpenHelper helper;
18 private SQLiteDatabase db;
19 @Override
20 protected void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 setContentView(R.layout.activity_main);
23 helper=new SqlOpenHelper(this, "book_store", null, 1);
24 btn1=(Button) findViewById(R.id.btn1);
25 btn2=(Button) findViewById(R.id.btn2);
26 btn3=(Button) findViewById(R.id.btn3);
27 btn4=(Button) findViewById(R.id.btn4);
28 btn1.setOnClickListener(this);
29 btn2.setOnClickListener(this);
30 btn3.setOnClickListener(this);
31 btn4.setOnClickListener(this);
32 }
33
34
35 @Override
36 public void onClick(View v) {
37 // TODO Auto-generated method stub
38 switch (v.getId()) {
39 case R.id.btn1:
40 db = helper.getWritableDatabase();
41 db.beginTransaction(); //开始事务
42 try {
43 ContentValues values=new ContentValues();
44 values.put("name", "Android");
45 values.put("price", 16.5);
46 values.put("category_id", "1");
47 db.insert("book", null, values);
48 db.setTransactionSuccessful(); //事务已经成功执行
49 Toast.makeText(this, "Create Success", Toast.LENGTH_SHORT).show();
50 } catch (Exception e) {
51 // TODO Auto-generated catch block
52 e.printStackTrace();
53 }finally{
54 db.endTransaction(); //结束事务
55 db.close();
56 }
57 break;
58 case R.id.btn2:
59 db=helper.getWritableDatabase();
60 ContentValues values=new ContentValues();
61 values.put("name", "zhangsan");
62 values.put("price", 20);
63 db.update("book", values, "id=?", new String[]{5+""});
64 break;
65 case R.id.btn3:
66 db=helper.getWritableDatabase();
67 db.delete("book", "id=?",new String[]{1+""} );
68 break;
69 case R.id.btn4:
70 db=helper.getWritableDatabase();
71 Cursor cursor=db.query("book", null, null, null, null, null, "id DESC");
72 while(cursor.moveToNext()){
73 String name=cursor.getString(cursor.getColumnIndex("name"));
74 String price=String.valueOf(cursor.getFloat(2));
75 Log.d("MainActivity", name);
76 Log.d("MainActivity", price);
77 }
78 break;
79 default:
80 break;
81 }
82 }
83
84 }

其中btn1代表创建数据库并向数据库中添加数据,btn2的点击事件是向数据库中更新数据,btn3则是删除操作,btn4是最为复杂的查询操作。

在向表中插入数据的时候,用到了事务,事务中的操作是要么都做,要么都不做,可以保证数据的正确。在每次操作数据库前,先使用我们自定义的帮助类的getWriteableDatabase()来打开(创建)数据库,并返回一个SQLiteDatabase类型的可操作对象。

添加数据:

调用SQLiteDatabase的insert方法,我们使用方法中有三个参数的那个就可以,第一个参数代表要操作的数据库表名,第二个参数表示哪列的值为空,一般填null,第三个参数则表示要插入的数据,是为ContentValues类型,ContentValues类型的变量有一个put方法,可以将数据以键-值对的形式存储。

更新数据:

SQLiteDatabase.update方法,我们使用有四个参数的方法,第一个参数还是代表我们要操作的数据库,第二个参数是要更新的值,为ContentValues类型,还是通过他的put方法来将要更新的值以键-值对的形式存储,第三个参数是相当于where条件,它跟第四个参数以占位符的方式来组成where条件,控制更新哪些满足条件的行。如:

 db.update("book", values, "id=?", new String[]{5+""});  id=? 第四个参数中的值则为'?'部分内容

若这两个参数填null,则更新所有行。该方法返回一个整型结果,为受影响行数。

删除数据:

SQLiteDatabase.delete方法,该方法有三个参数,第一个参数是代表我们要操作的数据库,第二个第三个参数与update中的基本一样,不在叙述。

查询数据:

也是数据库中最为复杂的一种操作,在此只简单地说下其用法,数据库的查询方法返回一个Cursor类型变量,我们通过Cursor的moveToNext方法来取出查询结果。查询有好多种写法可以使用,比如本Demo中的SQLiteDatabase.query方法,接收7个参数,不过我们不用担心,我们先不去管这些参数,只用第一个参数:要查询的表。和最后一个参数:按照id降序排列。然后再一个while循环中通过Cursor.getString()将值取出来。此方法的7个参数含义如下:

使用上面的方法来操作数据库得益于Android给我们提供的方便的API,这样即使我们不太懂SQL语言,也可以做出操作数据库的操作,但其实我们还可以使用SQL方式来操作数据库:

添加数据的方法:

db.execSQL("insert into book(name,price) values("haha",23)");  //sql语句方式

db.execSQL("insert into book(name,price) values(?,?)",new String[]{"haha",34});  //占位符的方式

更新数据:

db.execSQL("update book set name=? where id=?",new String[]{"pig",2+""});

删除数据:

db.execSQL("delete from book where id>?",new String[]{"3"});

查询数据:

db.rawQuery("select * from book",null);    //第二个参数是查询条件

Android学习笔记--Sqlite数据库的更多相关文章

  1. (转)Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解

    原文:http://blog.csdn.net/lidew521/article/details/8655229 1.SQLite介绍:最大特点是,无数据类型;除了可以使用文件或SharedPrefe ...

  2. Android学习笔记——SQLite

    该工程的功能是实现关于数据库的操作,即creat.update.insert.query.delete 调试的时候请用模拟器,用真机调试的时候进入cmd-adb shell,再进入cd data/da ...

  3. Android 开发笔记 “Sqlite数据库删除”

    1.代码方式 Context.deleteDatabase(String databaseName);//删除某一数据库 2.设置里面 进入应用程序 ,然后清除数据就ok了

  4. Android 学习笔记之如何使用SQLite数据库来保存数据...

    PS:最近一阵子都在为考试复习...坑爹的计算机网络,复习了3天,最后该不会的还是不会...明天还考英语...真蛋疼... 学习内容: 1.使用SQLite数据库来保存数据... SQLite:   ...

  5. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  6. 【转】Pro Android学习笔记(七):了解Content Provider(下上)

    我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,auth ...

  7. 【转】Pro Android学习笔记(五):了解Content Provider(上)

    Content Provider是抽象数据封装和数据访问机制,例如SQLite是Android设备带有的数据源,可以封装到一个content provider中.要通过content provider ...

  8. udacity android 学习笔记: lesson 4 part a

    udacity android 学习笔记: lesson 4 part a 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

  9. 七、Android学习第六天——SQLite与文件下载(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 七.Android学习第六天——SQLite与文件下载 SQLite SQ ...

随机推荐

  1. list, set操作

    def union_list(l1, l2): result = [] if not l1: result.extend(l2) return result if not l2: result.ext ...

  2. 查看服务器硬件配置信息(cpu/内存)

    1.查看cpu情况: 方法一:   Linux下CPU相关的参数保存在 /proc/cpuinfo 文件里   cat /proc/cpuinfo |more   方法二:   采用命令 dmesg ...

  3. P2P金融

    P2P金融又叫P2P信贷,是互联网金融(ITFIN)的一种.意思是:点对点. P2P金融指不同的网络节点之间的小额借贷交易(一般指个人),需要借助电子商务专业网络平台帮助借贷双方确立借贷关系并完成相关 ...

  4. iOS App 唤醒另一个App

    网上也有讲这块的,感觉讲得都不是很好.而且有一些细节根本没有讲清楚.这里重写整理一下相关知识点. 主要内容 URL Scheme 是什么? 项目中关键的配置 注意事项 URL Scheme 是什么? ...

  5. js中的编码与解码

    一.encodeURI()定义和用法 encodeURI() 函数可把字符串作为 URI 进行编码. 语法 encodeURI(URIstring) 参数 描述 URIstring 必需.一个字符串, ...

  6. java.lang.NoSuchFieldError: VERSION_2_3_0 报错解决方案

    java.lang.NoSuchFieldError: VERSION_2_3_0 at org.apache.struts2.views.freemarker.FreemarkerManager.c ...

  7. YTU 2601: 熟悉题型——填空题(删除线性表节点)

    2601: 熟悉题型--填空题(删除线性表节点) 时间限制: 1 Sec  内存限制: 128 MB 提交: 357  解决: 212 题目描述 给出一串具体长度的数据,删除指定数据. 已经给出部分代 ...

  8. poj-2393 Yogurt factory (贪心)

    http://poj.org/problem?id=2393 奶牛们有一个工厂用来生产奶酪,接下来的N周时间里,在第i周生产1 单元的奶酪需要花费ci,同时它们也有一个储存室,奶酪放在那永远不会坏,并 ...

  9. BZOJ 1452 Count(二维树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1452 题意:给出一个数字矩阵(矩阵中任何时候的数字均为[1,100]),两种操作:(1) ...

  10. JS通用方法总结(一)

    /** * id数组转换为json字符串 */ function arrayTojson(arr) { var jsonIds = "["; for ( var i = 0; i ...