【Android开发学习05】Android中SQLite数据库操作

SQLite官网: http://www.sqlite.org/
SQLite特点: 体积小,独立,开源,支持多种开发语言,支持最大2TB数据库。


一.基础知识:

1.SQLite的数据类型

NULL:空值。
INTEGER:带符号的整型,具体取决有存入数字的范围大小。
REAL:浮点数字,存储为8-byte IEEE浮点数。
TEXT:字符串文本。
BLOB:二进制对象。

smallint 16位元的整数。
interger 32位元的整数。
decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点后有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float  32位元的实数。
double  64位元的实数。
char(n)  n 长度的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000
date  包含了 年份、月份、日期。
time  包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。
datetime 包含日期时间格式,必须写成'2010-08-05'不能写为'2010-8-5',否则在读取时会产生错误!


2.SQLite的基本操作

SQLiteOpenHelper 抽象类:通过从此类继承实现用户类,来提供数据库打开、关闭等操作函数。

// 创建数据库
public void onCreate(SQLiteDatabase db)
// 更新数据库
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
// 打开数据库
public void onOpen(SQLiteDatabase db)
// 得到一个可读SQLiteDatabase对象
public synchronized SQLiteDatabase getReadableDatabase()
// 得到一个可写SQLiteDatabase对象
public synchronized SQLiteDatabase getWriteableDatabase()

SQLiteDatabase 数据库访问类:执行对数据库的插入记录、查询记录等操作。
execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;
rawQuery()方法可以执行select语句。
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)

table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
columns:要查询出来的列名。相当于select语句select关键字后面的部分。
selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:相当于select语句group by关键字后面的部分
having:相当于select语句having关键字后面的部分
orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。 

//还有两个,网上貌似都用的比较少,而我们这个例子中采用的是这些:
public long insert(
	String table, 		// 待插入的表名
	String nullColumnHack, 	// 通常设置为null
	ContentValues values		// 待插入的数据
)
public int update(
	String table, 		// 待更新的表名
	ContentValues values,	// 待更新的内容
	String whereClause,		// 选择通过哪个字段来更新
	String [] whereArgs		// 为whereClause字段要查询的值
)

③下面为网上常用的访问数据库的 一般流程
public void onClick(View v) {
	DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);
	SQLiteDatabase db = databaseHelper.getWritableDatabase();
	db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});  
	db.close(); 
};



二.编程实现:

1. 界面编辑( res\layout\main.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<Button 
		android:text="创建数据库" 
		android:id="@+id/ButtonCreate" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">
	</Button>									<!--添加一个Button控件-->
		<Button 
		android:text="增加数据" 
		android:id="@+id/ButtonInsert" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">
	</Button>									<!--添加一个Button控件-->
		<Button 
		android:text="更新数据" 
		android:id="@+id/ButtonUpdate" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">
	</Button>									<!--添加一个Button控件-->
		<Button 
		android:text="查询数据" 
		android:id="@+id/ButtonQuery" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">
	</Button>									<!--添加一个Button控件-->
</LinearLayout>
定义了一个垂直方向上的线性布局,及各操作的按钮,水平方向充满父窗口,垂直方向与内容等高。

界面布局效果如下:


2. 代码编辑(\src\wyf\zcl\MyActivity.java):

package wyf.zcl;
import wyf.zcl.sqlitedb.SqLiteDBHelper;				//引入相关包
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.widget.Button;						//引入相关包	
import android.widget.Toast;
public class MyActivity extends Activity {
    /** Called when the activity is first created. */
	private Button createButton;		//创建数据库按钮
	private Button insertBut;			//增加数据库记录按钮
	private Button updateBut;			//更新数据库记录按钮
	private Button queryBut;			//查询数据库记录按钮
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        createButton=(Button)findViewById(R.id.ButtonCreate);	//实例化创建数据库按钮
        insertBut=(Button)findViewById(R.id.ButtonInsert);		//实例化插入数据库按钮
        updateBut=(Button)findViewById(R.id.ButtonUpdate);		//实例化更新数据库按钮
        queryBut=(Button)findViewById(R.id.ButtonQuery);		//实例化查询数据库按钮
        createButton.setOnClickListener(new View.OnClickListener() {//创建数据库时调用
			@Override
			public void onClick(View v) {
				SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库
				System.out.println("create or open database success!");
				SQLiteDatabase sld=dh.getReadableDatabase();
				//得到一个SQLiteDatabase对象,用于操控数据库
				Toast.makeText(MyActivity.this,	 "创建或打开数据库", Toast.LENGTH_SHORT).show();	
		}});
        insertBut.setOnClickListener(new View.OnClickListener() {//增加数据库记录时调用
			@Override
			public void onClick(View v) {
				ContentValues cv=new ContentValues();	
				//得到ContentValues对象
				cv.put("uid", 1);						
												//放入键值对,键要与列名一致,值要与列的数据类型一致
				cv.put("uname", "zcl");					
												//放入键值对,键要与列名一致,值要与列的数据类型一致
				SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库	
				Toast.makeText(MyActivity.this,	 "插入记录", Toast.LENGTH_SHORT).show();								
				SQLiteDatabase sld=dh.getWritableDatabase();
												//得到一个SQLiteDatabase对象,用于操控数据库
				sld.insert("sqlitetest", null, cv);//增加数据库记录			
				System.out.println("success insert a new content!");								
		}});
        updateBut.setOnClickListener(new View.OnClickListener() {
        										//更新数据库记录时调用
			@Override
			public void onClick(View v) {
				SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);
												//创建数据库
				SQLiteDatabase sld=dh.getWritableDatabase();	
												//得到一个SQLiteDatabase对象,用于操控数据库
				ContentValues cv = new ContentValues();	//得到ContentValues对象
				Toast.makeText(MyActivity.this,	 "更新记录", Toast.LENGTH_SHORT).show();										
				cv.put("uname", "zcl_update");
				sld.update("sqlitetest", cv, "uid=?", new String[]{"1"});//更新数据库记录
				System.out.println("success updata the content!");								
		}});
        queryBut.setOnClickListener(new View.OnClickListener() {
        										//查询数据库记录时调用
			@Override
			public void onClick(View v) {
				SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库
				Toast.makeText(MyActivity.this,	 "查询记录", Toast.LENGTH_SHORT).show();										
				SQLiteDatabase sld=dh.getReadableDatabase();
												//得到一个SQLiteDatabase对象,用于操控数据库
				Cursor cursor=sld.query("sqlitetest", new String[]{"uid","uname"}, "uid=?", 
						new String[]{"1"}, null, null, null);	
				while(cursor.moveToNext()){				//打印输出
					String name=cursor.getString(cursor.getColumnIndex("uname"));
					System.out.println("query result:"+name);
		}}});
    }
}

(\src\wyf\zcl\zcl\sqlitedb\SqLiteDBHelper.java):

package wyf.zcl.sqlitedb;
import android.content.Context;								//引入相关包
import android.database.sqlite.SQLiteDatabase;				//引入相关包
import android.database.sqlite.SQLiteOpenHelper;			//引入相关包
import android.database.sqlite.SQLiteDatabase.CursorFactory;//引入相关包
public class SqLiteDBHelper extends SQLiteOpenHelper{
	public SqLiteDBHelper(Context context, String name, CursorFactory factory,
			int version) {//继承SQLiteOpenHelper的类,必须有该构造函数
		super(context, name, factory, version);
	}
	@Override
	public void onCreate(SQLiteDatabase db) {
	//创建数据库时调用,此方法是在调用了getReadableDatabase()或getWritableDatabase()后才调用
		db.execSQL("create table sqlitetest(uid long,uname varchar(25))");
		System.out.println("already create a database:sqlitetest.");
	}
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	//升级数据库时掉用
	}
}



 

 

 

 

附加一些本人使用的一些代码:

	public long GetSingerCount(){
		String tTempParam;
		Cursor tTempIdCursor;
		long singerCount=0;
		
		tTempParam="select count(*) from singerlist ;";
		tTempIdCursor = tSingerDb.rawQuery(tTempParam, null);
		tTempIdCursor.moveToFirst();
		singerCount=tTempIdCursor.getLong(0);
		tTempIdCursor.close();
		System.out.println("singerCount ========= "+singerCount);
		return singerCount;
		
	}



 

本文博客源地址:http://blog.csdn.net/ypist

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值