Android学习 —— 数据的存储与访问方式三: SQLite数据库
2012-11-11 09:47
841 查看
SQLite
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。SQLite是基于文件的轻量级数据库,特别适合嵌入式设备。
该数据库存储于特定的应用程序目录下:
/data/data/<application package name>/databases/<databasename>
SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。
例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。
另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。
如下面语句会忽略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分标准SQL语句,如:
查询语句:
select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。
如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。
如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。
如:delete from person where id=10
使用SQLiteOpenHelper对数据库进行版本管理
在进行数据库操作的时候,我们需要一个创建一个类DatabaseHelper去继承助手类:SQLiteOpenHelper
使用它可以进行一些数据库表初始化的动作。
比如:创建数据库表结构,以及添加一些初始记录,在升级的时候,对数据库表结构进行更新等,它是通过对数据库版本进行管理来实现上面的需求。
DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能
第一:getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作
第二:提供了onCreate()和onUpgrade()两个回调函数,前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构
获取数据库操作实例
通过getWritable( )或者getReadable( ) 获得数据库实例对象后,通过ContentValues可以对数据进行insert和update
使用Cursor可以对数据进行查询
注意:
getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。
getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
数据库何时被创建
当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动
生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始数据
示例1
使用SQLiteDatabase专门提供的添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 对数据库进行操作
布局文件
<RelativeLayout 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" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="createDatabase" android:id="@+id/createDBbutton" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="updateDatabase" android:id="@+id/updateDBbutton" android:layout_below="@id/createDBbutton" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="insert" android:id="@+id/insertButton" android:layout_below="@id/updateDBbutton" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="update" android:id="@+id/updateButton" android:layout_below="@id/insertButton" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="query" android:id="@+id/queryButton" android:layout_below="@id/updateButton" /> </RelativeLayout>
数据库助手类DatabaseHelper
package com.example.mysqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; //DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能, //第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作 //第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作 public class DatabaseHelper extends SQLiteOpenHelper{ private static final int VERSION = 1; public DatabaseHelper(Context context,String name){ this(context,name,null,VERSION); } //在SQLiteOepnHelper的子类当中,必须有该构造函数 public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { //必须通过super调用父类当中的构造函数 super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { System.out.println("create a Database"); //execSQL函数用于执行SQL语句 db.execSQL("create table user(id int,name varchar(20))"); } //数据库文件的版本号在更新的时候调用,所以为了添加新的字段,要修改版本号 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub System.out.println("update a Database"); } }
MainActivity
package com.example.mysqlite; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MySQLite extends Activity { private Button updateDBbutton = null; private Button createDBbutton = null; private Button insertButton = null; private Button queryButton = null; private Button updateButton = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_sqlite); updateDBbutton = (Button) findViewById(R.id.createDBbutton); createDBbutton = (Button) findViewById(R.id.updateDBbutton); insertButton = (Button)findViewById(R.id.insertButton); updateButton = (Button)findViewById(R.id.updateButton); queryButton = (Button)findViewById(R.id.queryButton); createDBbutton.setOnClickListener(new createDBListener()); updateDBbutton.setOnClickListener(new updateDBListener()); insertButton.setOnClickListener(new insertListener()); updateButton.setOnClickListener(new updateListener()); queryButton.setOnClickListener(new queryListener()); } private final class createDBListener implements OnClickListener{ public void onClick(View v) { // TODO Auto-generated method stub //创建一个DatabaseHelper对象 DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this,"test db"); //只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库 SQLiteDatabase db = dbHelper.getReadableDatabase(); } } private final class updateDBListener implements OnClickListener{ public void onClick(View v) { DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this,"test_db",null,2); SQLiteDatabase db = dbHelper.getReadableDatabase(); } } private final class insertListener implements OnClickListener{ public void onClick(View v) { //生成ContentValues对象 ContentValues values = new ContentValues(); DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this, "test db ",null,2); SQLiteDatabase db = dbHelper.getWritableDatabase(); //想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致 values.put("id",1); values.put("name", "zhangsan"); //调用insert方法,就可以讲数据插入到数据库当中 db.insert("user",null,values); } } private final class updateListener implements OnClickListener{ public void onClick(View v) { ContentValues values = new ContentValues(); DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this, "test db "); SQLiteDatabase db = dbHelper.getWritableDatabase(); values.put("name", "newzhangsan"); //update(String table, ContentValues values, String whereClause, String[] whereArgs) db.update("user",values,"id=?",new String[]{"1"}); } } private final class queryListener implements OnClickListener{ public void onClick(View v) { DatabaseHelper dbHelper = new DatabaseHelper(MySQLite.this, "test db "); SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null,null); while(cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); System.out.println("query--->" + name); } } } }
示例2:使用execSQL()和rawQuery()方法完成增删改查操作
JavaBean
public class Person { private String name ; private String phone; private Integer id; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Override public String toString() { return "Person [name=" + name + ", phone=" + phone + ", id=" + id + "]"; } }
MainActivity
import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取一个数据库帮助类 PersonDBOpenHelper helper = new PersonDBOpenHelper(this); //创建数据库 helper.getWritableDatabase(); } }
数据库帮助类
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class PersonDBOpenHelper extends SQLiteOpenHelper{ public PersonDBOpenHelper(Context context) { super(context, "person.db",null , 1); } //创建数据库 @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table person (id integer primary key autoincrement,name varchar(20) ,phone varchar(20))"); } //进行版本更新 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
DBDao
import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.itxushuai.sqlite.PersonDBOpenHelper; import com.itxushuai.sqlite.domain.Person; public class PersonDao { private PersonDBOpenHelper helper = null; //任何对象使用dao层,都要传递一个上下文对象,方便获取资源 public PersonDao(Context context) { helper = new PersonDBOpenHelper(context); } /** * 添加一条记录 * */ public void add(String name,String phone){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("insert into person (name,phone) values (?,?)",new Object[]{name,phone}); db.close(); } /** * 更新一条记录 * @param name * @param id * */ public void update(String name,String phone,Integer id){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("update person set name=? ,phone=? where id=?",new Object[]{name,phone,id}); db.close(); } /** * 根据id删除一条记录 * @param id * */ public void delete(Integer id){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("delete from person where id= ?",new Object[]{id}); db.close(); } /** * 根据姓名查找一条记录的id,没有的话,返回-1 * @param id * @return * */ public Integer find(String name){ SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.rawQuery("select * from person where id = ?", new String[]{name}); int id =-1; if(cursor.moveToFirst()){ id = cursor.getInt(0); return id; } db.close(); return id; } }
Mars视频与学习论坛:http://www.mars-droid.com/bbs/forum.php
相关文章推荐
- Android学习 —— 数据的存储与访问方式三: SQLite数据库
- Android学习 —— 数据的存储与访问方式一: 文件存取
- Android学习 —— 数据的存储与访问方式一: 文件存取
- android 数据存储和访问方式三:SQLite数据库详解
- Android学习 —— 数据的存储与访问方式二: SharedPreferences(偏好参数保存)
- Android学习 —— 数据的存储与访问方式四: ContentProvider
- Android学习 —— 数据的存储与访问方式四: ContentProvider
- Android学习 —— 数据的存储与访问方式二: SharedPreferences(偏好参数保存)
- Android开发学习之路- Android数据存储方式总结
- 在android开发中进行数据存储与访问的多种方式介绍
- Android中数据的存储与访问方式汇总教程(细分为6种方式)
- Android中数据的存储方式(二)—SQLite数据库
- Android数据的四种存储方式之SQLite数据库
- android(17)_数据存储与访问_SQLite数据库_修改数据库
- android 数据存储和访问方式一:文件详解
- Android数据存储和访问之SharedPreferences存储方式_用户登录记住密码案例
- Android学习总结二:五大布局、Android测试、数据存储访问(TextUtils)、Map的使用
- Android 学习笔记7---数据存储与访问
- Android基础学习__第2天__数据的存储与访问
- Android数据存储之Sqlite数据库的俩种使用方式