Android入门笔记之Sqlite

Android入门笔记之Sqlite

<1>简介

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。

SQLite由以下几个部分组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),是调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。

值得一提的是,袖珍型的SQLite竟然可以支持高达2TB大小的数据库,每个数据库都是以单个文件的形式存在,这些数据都是以B-Tree的数据结构形式存储在磁盘上。

在事务处理方面,SQLite通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程想数据库执行写操作之前,必须获得独占锁。在获得独占锁之后,其他的读或写操作将不会再发生。

SQLite采用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。

概括来讲,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。 

<2>关键步骤

一、 创建数据库

通过openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)方法创建数据库。    

iteDatabase db=this.openOrCreateDatabase("test_db.db",

Context.MODE_PRIVATE, null);
或者SQLiteDatabasedb2 =

SQLiteDatabase.openOrCreateDatabase("/data/data/com.test/databases/test_db2.db3",null);

如上两种方式均能创建数据库,this.openOrCreateDatabase是对SQLiteDatabase.openOrCreateDatabase而来,如代码所见,原生的SQLiteDatabase.openOrCreateDatabase()方法第一参数要求输入绝对路劲,而所有的数据库都是储存于“data/data/应用报名/databases”目录下,所以输入完全的绝对路劲是一件重复且繁杂的工作。采用this.openOrCreateDatabase则省去了此操作。

另外还可以通过写一个继承SQLiteOpenHelper类的方式创建数据库,此种方式是一种更加进阶的创建方式。 

SQLiteOpenHelper的使用方法 
SQLiteOpenHelper是一个辅助类来管理数据库的创建和版本。 
可以通过继承这个类,实现它的一些方法来对数据库进行一些操作。 
所有继承了这个类的类都必须实现下面这样的一个构造方法: 
public DatabaseHelper(Context context, Stringname, CursorFactory factory, int version) 
   第一个参数:Context类型,上下文对象。 
   第二个参数:String类型,数据库的名称 
   第三个参数:CursorFactory类型 
   第四个参数:int类型,数据库版本 
下面是这个类的几个方法: 
方法名 返回类型 描述 备注 
getReadableDatabase() synchronized SQLiteDatabase 创建或打开一个数据库可以通过这两个方法返回的SQLiteDatabase对象对数据库进行一系列的操作,如新建一个表,插入一条数据等 
getWritableDatabase() synchronized SQLiteDatabase 创建或打开一个可以读写的数据库
onCreate(SQLiteDatabase db) abstract void 第一次创建的时候调用
onOpen(SQLiteDatabase db) void 打开数据库
onUpgrade(SQLiteDatabase db,int oldVersion,intnewVersion) abstract void 升级数据库
close() synchronized void 关闭所有打开的数据库对象

<3>出现的问题

       可从DDMS中导出db文件。

<4>代码及解释


       Activity_sqlite.xml:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/dbcreate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="create" />

    <Button
        android:id="@+id/dbupgrade"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="upgrade" />

    <Button
        android:id="@+id/dbinsert"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="insert" />

    <Button
        android:id="@+id/dbdelete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="delete" />

    <Button
        android:id="@+id/dbselect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="select" />

    <Button
        android:id="@+id/dbupdate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="update" />

    <TextView
        android:id="@+id/dbview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="view" />

</LinearLayout>
SqliteActivity.java:

package com.func;

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;
import android.widget.TextView;

import com.test.R;

public class SqliteActivity extends Activity{
	/**   
	 * @ProjectName:  [androidtest] 
	 * @Package:      [com.func.SqliteActivity.java]  
	 * @ClassName:    [SqliteActivity]   
	 * @Description:    
	 * @Author:       [gmj]   
	 * @CreateDate:   [2013-9-7 下午8:00:49]   
	 * @Version:      [v1.0] 
	 */
	 private Button createDatabaseButton = null;  
	 private Button updateDatabaseButton = null;  
	 private Button insertButton = null;  
	 private Button updateButton = null;  
	 private Button selectButton = null;  
	 private Button deleteButton = null; 
	 private TextView tv = null;
	    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqlite);
        createDatabaseButton = (Button) findViewById(R.id.dbcreate);  
        updateDatabaseButton = (Button) findViewById(R.id.dbupgrade);  
        insertButton = (Button) findViewById(R.id.dbinsert);  
        updateButton = (Button) findViewById(R.id.dbupdate);  
        selectButton = (Button) findViewById(R.id.dbselect);  
        deleteButton = (Button) findViewById(R.id.dbdelete);
        tv = (TextView) findViewById(R.id.dbview);        
        createDatabaseButton.setOnClickListener(new CreateDatabaseOnClickListener());  
        updateDatabaseButton.setOnClickListener(new UpdateDatabaseOnClickListener());  
		insertButton.setOnClickListener(new InsertOnClickListener());  
		updateButton.setOnClickListener(new UpdateOnClickListener());  
		selectButton.setOnClickListener(new SelectOnClickListener());  
		deleteButton.setOnClickListener(new DeleteOnClickListener()); 
    }
    
    class CreateDatabaseOnClickListener implements OnClickListener {  
        public void onClick(View v) {  
            // 创建了一个DatabaseHelper对象,只执行这句话是不会创建或打开连接的  
            SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db");
            SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();  
        }  
    }
    
    // updateDatabaseButton点击事件监听器  
    class UpdateDatabaseOnClickListener implements OnClickListener {  
        public void onClick(View v) {  
            // TODO Auto-generated method stub  
            SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2);
            // 得到一个只读的SQLiteDatabase对象  
            SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();  
        }  
  
    }  
  
    // insertButton点击事件监听器  
    class InsertOnClickListener implements OnClickListener {  
        public void onClick(View v) {  
            // 创建ContentValues对象  
            ContentValues values = new ContentValues();  
            // 向该对象中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致  
            values.put("id", 1);  
            values.put("name", "abc");  
            // 创建DatabaseHelper对象  
            SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2);
            // 得到一个可写的SQLiteDatabase对象  
            SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();  
            // 调用insert方法,就可以将数据插入到数据库当中  
            // 第一个参数:表名称  
            // 第二个参数:SQl不允许一个空列,如果ContentValues是空的,那么这一列被明确的指明为NULL值  
            // 第三个参数:ContentValues对象  
            sqliteDatabase.insert("user", null, values);  
        }  
    }  
  
    // updateButton点击事件监听器  
    class UpdateOnClickListener implements OnClickListener {  
        public void onClick(View v) {  
            // 创建一个DatabaseHelper对象  
            SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2);
            // 得到一个可写的SQLiteDatabase对象  
            SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();  
            // 创建一个ContentValues对象  
            ContentValues values = new ContentValues();  
            values.put("name", "ggg");  
            // 调用update方法  
            // 第一个参数String:表名  
            // 第二个参数ContentValues:ContentValues对象  
            // 第三个参数String:where字句,相当于sql语句where后面的语句,?号是占位符  
            // 第四个参数String[]:占位符的值  
            sqliteDatabase.update("user", values, "id=?", new String[] { "1" });  
            System.out.println("-----------update------------");  
        }  
    }  
  
    // selectButton点击事件监听器  
    class SelectOnClickListener implements OnClickListener {  
        public void onClick(View v) {  
            String id = null;  
            String name = null;  
            //创建DatabaseHelper对象  
            SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2);
            // 得到一个只读的SQLiteDatabase对象  
            SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();  
            // 调用SQLiteDatabase对象的query方法进行查询,返回一个Cursor对象:由数据库查询返回的结果集对象  
            // 第一个参数String:表名  
            // 第二个参数String[]:要查询的列名  
            // 第三个参数String:查询条件  
            // 第四个参数String[]:查询条件的参数  
            // 第五个参数String:对查询的结果进行分组  
            // 第六个参数String:对分组的结果进行限制  
            // 第七个参数String:对查询的结果进行排序  
            Cursor cursor = sqliteDatabase.query("user", new String[] { "id",  
                    "name" }, "id=?", new String[] { "1" }, null, null, null);  
            // 将光标移动到下一行,从而判断该结果集是否还有下一条数据,如果有则返回true,没有则返回false  
            while (cursor.moveToNext()) {  
                id = cursor.getString(cursor.getColumnIndex("id"));  
                name = cursor.getString(cursor.getColumnIndex("name"));  
            }  
            tv.setText("id: "+id + "\nname: "+name);
            System.out.println("-------------select------------");  
            System.out.println("id: "+id);  
            System.out.println("name: "+name);  
        }  
    }  
  
    // deleteButton点击事件监听器  
    class DeleteOnClickListener implements OnClickListener {  
        public void onClick(View v) {  
            //创建DatabaseHelper对象  
            SqliteHelper dbHelper = new SqliteHelper(SqliteActivity.this , "test_db" , 2); 
            //获得可写的SQLiteDatabase对象  
            SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();  
            //调用SQLiteDatabase对象的delete方法进行删除操作  
            //第一个参数String:表名  
            //第二个参数String:条件语句  
            //第三个参数String[]:条件值  
            sqliteDatabase.delete("user", "id=?", new String[]{"1"});  
            System.out.println("----------delete----------");  
        }  
    }  
    
}


SqliteHelper.java:

package com.func;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class SqliteHelper extends SQLiteOpenHelper{

	public SqliteHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}
	
	public SqliteHelper(Context context, String name, int version){  
        this(context,name,null,version);  
    }  
  
    public SqliteHelper(Context context, String name){  
        this(context,name,1);  
    }  
    
	@Override
	public void onCreate(SQLiteDatabase arg0) {
		// TODO Auto-generated method stub
		System.out.println("create a db");
		arg0.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("upgrade a db");
	}
}




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值