前几天学习了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. inno setup判断是Windows系统版本(其实还是Delphi代码,还能检查域控制器和家庭版)

    1.设置Windows最低版本要求 [Setup]: MinVersion 格式: a.bb,c.dd,这里 a.bb 是 Windows 版本,c.dd 是 Windows NT 版本. 默认值: ...

  2. 编译FreePascal和Lazarus

    一,准备目录假设我们准备将整个FreePascal环境安装到D盘的fpc目录下,那么我们需要创建以下几个目录:d:\fpc_svn\bind:\laz_svn二,准备环境1,安装SVN客户端Torto ...

  3. Golang哲学思想

    Golang是一门新语言,经过几年发展,慢慢地也已经被许多大公司认可.最大的特点是速度快,并发性好,与网络的功能结合好,是一门服务端语言,号称“网络时代的新语言”:另外还是一个编译型的Python.不 ...

  4. PHP使用CURL详解

    CURL是一个非常强大的开源库,支持很多协议,包括HTTP.FTP.TELNET等,我们使用它来发送HTTP请求.它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS ...

  5. 《Linux shell变量总结回顾》RHEL6(转)

    文章版权:http://www.cnblogs.com/linux-super-meng/ 环境变量路径: [root@localhost ~]# set   //查看到的是局部变量和全局变量2种 [ ...

  6. Myeclipse 2014 javascript 添加 jquery 代码提示

    近日在写js,在myeclipse中没有jquery代码的提示着实不方便,在网上使用度娘搜索添加提示方式,试了多种,现经测试以下方式可取. 1.打开help菜单下的install from site. ...

  7. WebStorm 对 Mocha 完美支持。

    如果你在使用 Mocha 的话,请使用 WebStorm 来运行 mocha,Webstorm可以清晰查看每个 test 的详细信息,非常直观,强烈推荐.

  8. AOJ -0189 Convenient Location && poj 2139 Six Degrees of Cowvin Bacon (floyed求任意两点间的最短路)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=78207 看懂题就好. 求某一办公室到其他办公室的最短距离. 多组输入,n表示 ...

  9. Support Library(5)在eclipse中导入SupportXXXDemos

    Support4Demos只用一个v4.,Support7Demos只要v13.jar, SupportAppNavigation只要一个v4.jar. Support7Demos 需要资源全部v7系 ...

  10. How to: Run Tests from Microsoft Visual Studio

    https://msdn.microsoft.com/en-us/library/ms182470.aspx Running Automated Tests in Visual Studio Visu ...