Android数据库SQLite应用基础一

SQLite数据库

在Android中存储数据,还可以通过SQLite轻量级嵌入式数据库来保存一些数据

SQLite数据库特性:

1轻型,占用资源低,主要应用于嵌入式产品中

2支持跨平台,不仅仅支持Linux、同样适用于Windows、IOS操作系统

3支持多语言编程使用,主流的Java、C、.NET、php都可以

4关系型数据库,支持SQL-92的大多数SQL语法,支持事务

5在android系统中,各个app自己的SQLite数据库存储目录/data/data/app包名/databases/数据库名.db

6缺点是SQLite是数据库级别锁,不支持多进程同时操作同一数据库、表级锁、行级锁

 

SQLite数据库工具

一般的对于数据库,我们最关系的就是数据库里面的存储数据

为了方便查看SQLite数据库里面的数据,有2个比较方便的工具,可方便查看数据库里面的数据

1sqlite3

     默认安装完Andorid SDK后,在$ANDROID_HOME/sdk/tools目录下面就有了sqlite3

     使用步骤:

       

     截图只是查询的应用,更多详细可以百度其它资料    

 

2SQLite Expert

     使用步骤:㈠、下载SQLite Expert,并安装。这里提供一个免费的个人版的SQLite Expert百度网盘的下载地址http://pan.baidu.com/s/1sjDRw9R

                     ㈡、导出android应用/data/data/app包名/databases/数据库.db 到本机

                     ㈢、打开SQLite Expert Pro,File -> Open数据库即可

      

 

SQLite数据库编程使用方法

1直接使用SQLiteDatabase           类来增删改查数据

2通过继承SQLiteOpenHelper 帮助类来增删改查数据

下面我们来通过实例一一看下这两种方法的使用

 

1直接使用SQLiteDatabase           类来增删改查数据

使用步骤:㈠、通过context方法openOrCreateDatabase( , , , )创建数据库

                ㈡、数据库exeSQL(增删改查语句)

布局文件:activity_main.xml

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
	<!-- 创建数据库  按钮 -->
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建SQLite数据库"
        android:onClick="open"/>
    <!-- 数据库 增加数据 按钮 -->
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="增"
        android:onClick="c"/>
    <!-- 数据库 删除数据 按钮 -->    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删"
        android:onClick="d"/>
    <!-- 数据库 更新数据 按钮 -->        
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="改"
        android:onClick="u"/>
    <!-- 数据库 查询数据 按钮 -->
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查"
        android:onClick="r"/>
    
    <TextView 
        android:id="@+id/tv_main_infor"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:textColor="#ff0000"/>

</LinearLayout>

代码文件:MainActivity.java

package com.yihui.sqlitedemo;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

	private SQLiteDatabase sqliteDB;
	private TextView tv_main_infor;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tv_main_infor = (TextView) findViewById(R.id.tv_main_infor); 
          
    }
    
    /*创建数据库*/
    public void open(View v){
    	sqliteDB = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
    	
    	sqliteDB.execSQL("drop table if exists person");
    	String createTableSQL = "create table person"
	              			  + " (_id integer primary key,"	//编号
	              			  + "  name varchar(20),"			//姓名
	              			  + "  age integer"					//年龄
	              			  + " );";
    	sqliteDB.execSQL(createTableSQL);
    	tv_main_infor.setText("创建数据库成功:\n" + getDatabasePath("test.db").getPath());
    }
    
    /*增c - Create*/
    public void c(View v){
    	String insertSQL = "insert into person values(?,?,?)";
    	sqliteDB.execSQL(insertSQL, new Object[]{1369,"李5辉",29});
    	sqliteDB.execSQL(insertSQL, new Object[]{1368,"李4辉",28});
    	sqliteDB.execSQL(insertSQL, new Object[]{1367,"李3辉",27});
    	sqliteDB.execSQL(insertSQL, new Object[]{1366,"李2辉",26});
    	sqliteDB.execSQL(insertSQL, new Object[]{1365,"李1辉",25});
    	tv_main_infor.setText("插入数据成功!");
    }
    
    /*删d - Delete*/
    public void d(View v){
    	String deleteSQL = "delete from person where _id = ?";
    	sqliteDB.execSQL(deleteSQL, new Object[]{1365});
    	tv_main_infor.setText("1365 id用户删除数据成功!");
    }
    
    /*改u - Update*/
    public void u(View v){
    	String updateSQL = "update person set name = ? where _id = ?";
    	sqliteDB.execSQL(updateSQL, new Object[]{"李update辉",1367});
    	tv_main_infor.setText("1367 id用户更新数据成功!");
    }
    
    /*查r - Retrieve*/
    public void r(View v){
    	StringBuffer sb = null;
    	String selectSQL = "select * from person where name like ? order by _id";
    	Cursor rawQuery = sqliteDB.rawQuery(selectSQL,new String[]{"李%辉"});
    	if(rawQuery != null && rawQuery.getCount() > 0){
    		sb = new StringBuffer();
    		while(rawQuery.moveToNext()){
    			sb.append("id:" + rawQuery.getInt(0)).append("\t");
    			sb.append("姓名:" + rawQuery.getString(1)).append("\t");
    			sb.append("年龄:" +  rawQuery.getString(2)).append("\n");
    		}
    	}
    	tv_main_infor.setText(sb);
    }
}

运行效果:

             



2通过继承SQLiteOpenHelper 帮助类来增删改查数据

使用步骤:㈠、继承SQLiteOpenHelper类

                       复写 public void onCreate(SQLiteDatabase db)                                                     //数据库创建时的回调方法

                              public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)   //数据库更新时的回调方法

                ㈡、通过子类getReadableDatabase() 、getWritableDatabase() 得到可读或可写的SQLiteDatabase

                ㈢、再通过SQLiteDatabase,执行exeSQL() 增删改查

Demo目录结构:

         

①、数据库帮助类SQLiteOpenHelper

package com.yihui.sqlitedemo.dbutils;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class SQLiteDBUtils extends SQLiteOpenHelper {

	private static final String TAG = "SQLiteDBUtils";

	public SQLiteDBUtils(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}

	/* 数据库创建时调用的回调方法   */
	@Override
	public void onCreate(SQLiteDatabase db) {
		Log.i(TAG, "onCreate -- 数据库创建时调用的回调方法");
		
		String createTableSQL = "create table person"
				              + " (_id integer primary key,"	//编号
				              + "  name varchar(20),"			//姓名
				              + "  age integer"					//年龄
				              + " );";
		db.execSQL(createTableSQL);
	}

	/* 数据库更新时调用的回调方法   */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		if(oldVersion == 1 && newVersion == 2){	//当数据库前一个版本为1,新版本为2时更新操作
			Log.i(TAG, "onUpgrade -- 数据库更新时调用的回调方法");
			
			String upgradeTableSQL = "alter table person"
								   + " add balance integer;";
			db.execSQL(upgradeTableSQL);
		}
	}
}

②、实体类

package com.yihui.entities;

public class Person {

	private int id;
	private String name;
	private int age;
	private int balance;
	
	public Person(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getBalance() {
		return balance;
	}
	public void setBalance(int balance) {
		this.balance = balance;
	}
}

③、实体类DAO

package com.yihui.dao;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.yihui.entities.Person;
import com.yihui.sqlitedemo.dbutils.SQLiteDBUtils;

public class PersonDAO {
	
	private static final String TAG = "SQLiteDBUtils";
	private SQLiteDBUtils personSQLiteDBUtils;
	
	public PersonDAO(Context context){
		personSQLiteDBUtils = new SQLiteDBUtils(context, "hello.db", null, 1);
	}
	
	/* 增  */
	public void insert(Person person){
		SQLiteDatabase writableDatabase = personSQLiteDBUtils.getWritableDatabase();
		if(writableDatabase.isOpen()){
			writableDatabase.execSQL("insert into person(_id,name,age) values (?,?,?)", new Object[]{person.getId(),person.getName(),person.getAge()});
			writableDatabase.close();
		}
	}
	
	/* 删  */
	public void delete(Person person){
		SQLiteDatabase writableDatabase = personSQLiteDBUtils.getWritableDatabase();
		if(writableDatabase.isOpen()){
			writableDatabase.execSQL("delete from person where _id = ?", new Object[]{person.getId()});
			writableDatabase.close();
		}
	}
	
	/* 改   */
	public void update(Person person){
		SQLiteDatabase writableDatabase = personSQLiteDBUtils.getWritableDatabase();
		if(writableDatabase.isOpen()){
			writableDatabase.execSQL("update person set name = ?, age = ? where _id = ?", new Object[]{person.getName(),person.getAge(),person.getId()});
			writableDatabase.close();
		}
	}
	
	/* 查   */
	public void queryAll(){
		SQLiteDatabase readableDatabase = personSQLiteDBUtils.getReadableDatabase();
		if(readableDatabase.isOpen()){
			Cursor rawQuery = readableDatabase.rawQuery("select * from person", null);
			if(rawQuery!=null && rawQuery.getCount()>0){
				while(rawQuery.moveToNext()){
					Log.i(TAG, "person - _id:" + rawQuery.getInt(0) + " name:" + rawQuery.getString(1) + " age:" + rawQuery.getInt(2) + "\n");
				}
			}
		}
	}
}

④、Junit测试

package com.yihui.sqlitedemo.junit;

import android.test.AndroidTestCase;

import com.yihui.dao.PersonDAO;
import com.yihui.entities.Person;
import com.yihui.sqlitedemo.dbutils.SQLiteDBUtils;

public class TestDBSQLite extends AndroidTestCase {

	/* 创建数据库 或者 更新数据库 */
	public void testDBSQLiteOpenHelper(){
		SQLiteDBUtils dbSQLHelper = new SQLiteDBUtils(getContext(), "hello.db", null, 1);
		dbSQLHelper.getReadableDatabase();
	}
	
	/* 增   */
	public void testInsert(){
		PersonDAO personDAO = new PersonDAO(getContext());
		for(int i = 0; i < 10; i++){
			personDAO.insert(new Person(i, "terry" + i, 20+i));
		}
	}
	
	/* 删  */
	public void testDelete(){
		PersonDAO personDAO = new PersonDAO(getContext());
		personDAO.delete(new Person(0, "terry", 20));
	}
	
	/* 改  */
	public void testUpdate(){
		PersonDAO personDAO = new PersonDAO(getContext());
		personDAO.update(new Person(8, "李yi辉", 28));
	}
	
	/* 查   */
	public void testQueryAll(){
		PersonDAO personDAO = new PersonDAO(getContext());
		personDAO.queryAll();
	}
}


http://blog.csdn.net/yihuiworld


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值