Android中SQLite数据库操作
Android中SQLite数据库操作
发布时间:2015-06-05 来源:查字典编辑
摘要:一.基础知识:1.SQLite的数据类型:NULL:空值。INTEGER:带符号的整型,具体取决有存入数字的范围大小。REAL:浮点数字,存...

一.基础知识:

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 抽象类:通过从此类继承实现用户类,来提供数据库打开、关闭等操作函数。

[java]

// 创建数据库

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()

// 创建数据库

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 数据库访问类:执行对数据库的插入记录、查询记录等操作。

[java]

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字段要查询的值

)

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字段要查询的值

)

③下面为网上常用的访问数据库的一般流程:

[java]

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();

};

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. 界面编辑(reslayoutmain.xml):

[java]

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:text="创建数据库"

android:id="@+id/ButtonCreate"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:text="增加数据"

android:id="@+id/ButtonInsert"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:text="更新数据"

android:id="@+id/ButtonUpdate"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:text="查询数据"

android:id="@+id/ButtonQuery"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:text="创建数据库"

android:id="@+id/ButtonCreate"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:text="增加数据"

android:id="@+id/ButtonInsert"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:text="更新数据"

android:id="@+id/ButtonUpdate"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

android:text="查询数据"

android:id="@+id/ButtonQuery"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

定义了一个垂直方向上的线性布局,及各操作的按钮,水平方向充满父窗口,垂直方向与内容等高。

界面布局效果如下:

Android中SQLite数据库操作1

2. 代码编辑(srcwyfzclMyActivity.java):

[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(yout.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);

}}});

}

}

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(yout.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);

}}});

}

}

(srcwyfzclzclsqlitedbSqLiteDBHelper.java):

[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) {

//升级数据库时掉用

}

}

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) {

//升级数据库时掉用

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新安卓软件开发学习
热门安卓软件开发学习
编程开发子分类