赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android的数据库操作
Android的数据库操作

在Android系统中,为了有效地对数据进行管理,提供了SQLite数据库引擎来实现结构化数据存储。SQLite是一种嵌入式的数据库引擎,占用资源非常少,因而在嵌入式设备中应用广泛。SQLite没有提供服务器进程,其所有的数据都包含在同一个文件中。Android系统主要通过SQLiteDatabase类、SQLiteOpenHelper类和Cursor接口来对数据库进行操作,可以完成数据的增加、删除、更新和查找等基本操作,同时也可以执行大多数的SQL语句。

1.SQLiteDatabase类:数据库对象

SQLiteDatabase类是实现数据库管理和操作的主体,提供了打开、创建、添加、更新、删除、检索和执行SQL命令等一系列方法。SQLiteDatabase类中的方法主要用于SQLite数据库,这是Android系统支持的最重要的数据库类型。
1)openOrCreateDatabase方法:打开或创建数据库
该方法用于打开或者创建一个数据库文件。如果指定的数据库已经存在,则打开该数据库;否则将创建该指定的数据库,创建成功则返回一个SQLiteDatabase对象,该方法是SQLiteDatabase类中创建数据库的主要方法。语法格式有几种:
public static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory,DatabaseErrorHandle errorHandle)
public static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)
public static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactory factory)
public SQLiteDatabase openOrCreateDatabase (String name, int mode, SQLiteDatabase.CursorFactory factory)
其中,参数path为数据库创建路径,必须采用数据库全路径,如/data/data/package/databases/ mydb.db;factory指定返回一个Cursor子类的工厂,可以通过指定null来表示使用默认工厂;errorHandle为错误句柄;file为File类型的数据库;name为数据库名称,其保存路径默认为数据库全路径;mode为打开或者创建模式,可以取MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE和MODE_PRIVATE。示例:
private SQLiteDatabase mydb=null;
String DATABASE_NAME="FirstDataBase.db";
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
2)openDatabase方法:打开数据库
该方法用于打开一个数据库文件。如果指定的数据库已经存在,则打开该数据库,否则抛出错误。该方法是SQLiteDatabase类中打开一个已有数据库的主要方法。语法格式有几种:
public static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags,DatabaseErrorHandle errorHandle)
public static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags)
其中,参数path为数据库创建路径,必须采用数据库全路径,如/data/data/package/databases/ mydb.db;factory指定返回一个Cursor子类的工厂,可以通过指定null来表示使用默认工厂;errorHandle为错误句柄;flags为打开模式,可以取MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE和MODE_PRIVATE。示例:
private SQLiteDatabase mydb=null;
String PATH="/data/data/iflab.test/databases/ firstdatabse.db";
mydb=SQLiteDatabase.openDatabase(PATH,null,MODE_PRIVATE);
3)close方法:关闭数据库
该方法用于关闭一个已经打开的数据库文件。当对一个数据库文件操作完成时,应及时通过该方法将其关闭。否则容易引起错误。语法格式:
public void close()
4)execSQL方法:执行SQL语句
该方法用于执行一条SQL语句,该SQL语句采用字符串的形式指定,SQLiteDatabase对象可以通过该方法执行绝大多数的SQL语句,例如创建表、插入数据、查询数据、更新数据和删除数据等。语法格式:
public void execSQL(String sql)
其中,sql为字符串类型的SQL语句。示例:
private SQLiteDatabase mydb=null;
String DATABASE_NAME="FirstDataBase.db";
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
String ID="_id";
String NAME="name";
String AGE="age";
String HOME="home";
String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+" ("+ID+" INTEGER PRIMARY KEY,"+NAME+" TEXT,"+AGE+" TEXT,"+HOME+" TEXT)";
try{
mydb.execSQL(CREATE_TABLE);
}catch(Exception e){}
mydb.close();
5)insert方法:插入数据
该方法用于在数据库中插入一条数据,通过指定表名和数据对象来实现。在Android系统中,数据需要打包到ContentValues对象中。ContentValues对象其实相当于一个Map,Key值代表了字段名称,Value值代表了字段的值。也可以通过execSQL方法执行相应的SQL语句来插入数据。语法格式:
public long insert(String table,String nullColumnHack,ContentValues values)
其中,参数table为数据插入的表名;nullColumnHack为空列的默认值,一般设置为null;values为插入的数据值,ContentValues对象。示例:
public class firstActivity extends Activity{
private SQLiteDatabase mydb=null;
private final static String DATABASE_NAME="FirstDataBase.db";
private final static String TABLE_NAME="firstTable";
private final static String ID="_id";
private final static String NAME="name";
private final static String AGE="age";
private final static String HOME="home";
private final static String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+" ("+ID+" INTEGER PRIMARY KEY,"+NAME+" TEXT,"+AGE+" TEXT,"+HOME+" TEXT)";
private EditText editText=null;
private EditText edit1=null;
private EditText edit2=null;
private EditText edit3=null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
editText=(EditText)findViewById(R.id.editText1);
edit1=(EditText)findViewById(R.id.edit1);
edit2=(EditText)findViewById(R.id.edit2);
edit3=(EditText)findViewById(R.id.edit3);
edit1.setText("");
edit2.setText("");
edit3.setText("");
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
try{
mydb.execSQL(CREATE_TABLE);
}catch(Exception e){}
ContentValues cv=new ContentValues();
cv.put(NAME,"张三");
cv.put(AGE,"18");
cv.put(HOME,"北京");
mydb.insert(TABLE_NAME,null,cv);
cv.put(NAME,"李四");
cv.put(AGE,"19");
cv.put(HOME,"上海");
mydb.insert(TABLE_NAME,null,cv);
showData();
mydb.close();
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
ContentValues cv=new ContentValues();
cv.put(NAME,edit1.getText().toString());
cv.put(AGE,edit2.getText().toString());
cv.put(HOME,edit3.getText().toString());
mydb.insert(TABLE_NAME,null,cv);
showDate();
mydb.close();
}
});
}
public void showData(){
editText.setText("数据库内容:\n");
editText.append("姓名\t\t年龄\t\t籍贯\n");
Cursor cur=mydb.query(TABLE_NAME,new String[] {ID,NAME,AGE,HOME},
null,null,null,null,null);
int count=cur.getCount();
if(cur!=null&&count>=0){
if(cur.moveToFirst()){
do{
String name=cur.getString(1);
String age=cur.getString(2);
String home=cur.getString(3);
editText.append(""+name+"\t\t"+age+"\t\t"+home+"\n");
}while(cur.moveToNext());
}
}
}
}
代码中,首先通过openOrCreateDatabase方法创建数据库,然后通过execSQL方法新建一个表,然后为ContentValues对象赋值,并使用insert方法在数据库中插入2条数据。在按钮的监听器中,通过获取编辑框中的数据,使用insert方法在数据库中插入用户输入的数据。
6)delete方法:删除数据
该方法用于在数据库中删除数据,通过指定删除条件和删除条件值数据来实现。该方法就是将删除数据的SQL语句进行了封装,也可以通过execSQL方法执行相应的SQL语句来删除数据。语法格式:
public int delete(String table,String whereClause,String[] whereArgs)
其中,参数table为删除数据的表名称;whereClause为删除条件,通过字符串的形式指定;whereArgs为删除条件值数据。示例:
......
Button btn2=(Button)findViewById(R.id.button2);
btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
String whereClause="name=?";
String[] whereArgs={edit1.getText().toString()};
mydb.delete(TABLE_NAME,whereClause,whereArgs);
showData();
mydb.close();
}
});
......
在前面的代码中增加了一个删除数据按钮。
7)query方法:查询数据
该方法用于在数据库中查询数据,通过指定查询条件和查询条件值数据来实现。该方法是将查询数据的SQL语句进行了封装,也可以通过execSQL方法执行相应的SQL语句来查询数据。语法格式:
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)
其中,参数table为查询数据的表名;columns为查询的数据列,字符串数组的形式;selection为查询条件,通过字符串形式指定;selectionArgs为查询条件值数据;groupBy为分组列;having为分组条件;orderBy为排序类。示例:
......
Button btn3=(Button)findViewById(R.id.button3);
btn3.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
String selection="name=?";
String[] selectionArgs={edit1.getText().toString()};
Cursor cur=mydb.query(TABLE_NAME,new String[] {ID,NAME,AGE,
HOME},selection,selectionArgs,null,null,null);
if(cur!=null){
if(cur.moveToFirst()){
String name=cur.getString(1);
String name=cur.getString(2);
String name=cur.getString(3);
edit1.setText(name);
edit2.setText(age);
edit3.setText(home);
}
}else{}
showDate();
mydb.close();
}
});
......
在前面的代码中增加了一个查询数据按钮。
8)update方法:更新数据
该方法用于在数据库中更新已有的数据,通过指定查询条件和查询条件值数据来找到对应的数据,并通过指定更新的数据来进行更新。该方法就是将更新数据的SQL语句进行了封装,也可以通过execSQL方法执行相应的SQL语句来更新数据。语法格式:
public int update(String table,ContentValues values,String whereClause,String[] whereArgs)
其中,参数table为更新数据的表名;values为更新的数据;whereClause为查询条件,通过字符串的形式指定;whereArgs为查询条件值数据。示例:
......
Button btn4=(Button)findViewById(R.id.button4);
btn4.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
ContentValues cv=new ContentValues();
cv.put(NAME,edit1.getText().toString());
cv.put(AGE,edit2.getText().toString());
cv.put(HOME,edit3.getText().toString());
String whereClause="name=?";
String[] whereArgs={edit1.getText().toString()};
mydb.update(TABLE_NAME,cv,whereClause,whereArgs);
showDate();
mydb.close();
}
});
......
在前面的代码中增加了一个更新数据按钮。

2.Cursor接口:查询游标接口

Cursor接口是一个查询结果的游标接口,Android系统通过该接口提供了很多遍历查询结果的方法,如移动指针、获取列值、获取记录的条数以及各种判断方法。程序中,通过query方法查询的结果是存放在Cursor接口的对象中。
1)close方法:关闭游标
该方法用于关闭游标,这样可以释放其占用的资源。为了提高应用程序和系统的运行速度,推荐每次游标操作结束之后都使用该方法关闭。语法格式:
public abstract void close()
示例:
public void showData(){
editText.setText("数据库内容:\n");
editText.append("姓名\t\t年龄\t\t籍贯\n");
Cursor cur=mydb.query(TABLE_NAME,new String[] {ID,NAME,AGE,HOME},
null,null,null,null,null);
int count=cur.getCount();
if(cur!=null&&count>=0){
if(cur.moveToFirst()){
do{
String name=cur.getString(1);
String age=cur.getString(2);
String home=cur.getString(3);
editText.append(""+name+"\t\t"+age+"\t\t"+home+"\n");
}while(cur.moveToNext());
}
}
cur.close();
}
2)getCount方法:获取数据条数
该方法用于获取查询结果中数据的条数,其返回值为int整型。如果查询的结果为空,将返回0。语法格式:
public abstract int getCount()
示例:
int count=cur.getCount();
3)getColumnCount方法:获取列数量
该方法用于获取查询结果中数据的列数量,返回值为int整型。查询结果的列数量与数据库中列的数量可以不同,因为可以在query查询方法中指定需要查询获得的列。语法格式:
public abstract int getColumnCount()
示例:
int count=cur.getColumnCount();
4)getColumnIndex方法:获取列编号
该方法用于获取查询结果中数据的列编号,返回值为int整型。数据库中的列编号从0开始依次递增,第一个数据一般是_id,其编号为0。如果列不存在,则返回-1。语法格式:
public abstract int getColumnIndex(String columnName)
示例:
int count1=cur.getColumnIndex(ID);
int count2=cur.getColumnIndex(NAME);
5)getColumnIndexOrThrow方法:获取列编号
该方法用于获取查询结果中数据的列编号,返回值为int整型。数据库中的列编号从0开始依次递增,第一个数据一般是_id,其编号为0。如果列不存在,该方法将抛出IllegalArgumentException异常。语法格式:
public abstract int getColumnIndexOrThrow(String columnName)
6)getColumnName方法:获取列名
该方法用于获取查询结果中数据的列名,通过指定列编号来实现,列编号是以0为起始并依次递增的。语法格式有几种:
public abstract String getColumnName(int columnIndex)
public abstract String[] getColumnNames()
其中,参数columnIndex为指定的列编号。第一个函数用于获取指定列编号的列名,第二个函数用于获取查询结果中全部的列名,返回值保存在字符串数组中。
7)getString方法:获取字符串内容
该方法用于获取查询结果中指定列的字符串内容,通过指定列编号来实现。如果数据库中该列的数据内容为字符串形式,则使用该方法,否则应选择其他相类似的方法。语法格式:
public abstract String getString(int columnIndex)
其中,参数columnIndex为指定的列编号。示例:
String str1=cur.getString(1);
8)getDouble方法:获取双精度浮点型内容
该方法用于获取查询结果中指定列的Double类型内容,通过指定列编号来实现。如果数据库中该列的数据内容为Double类型,则使用该方法,否则应选择其他相类似的方法。语法格式:
public abstract double getDouble(int columnIndex)
9)getFloat方法:获取单精度浮点型内容
该方法用于获取查询结果中指定列的Float类型内容,通过指定列编号来实现。如果数据库中该列的数据内容为Float类型,则使用该方法,否则应选择其他相类似的方法。语法格式:
public abstract float getFloat(int columnIndex)
10)getInt方法:获取整型内容
该方法用于获取查询结果中指定列的Int类型内容,通过指定列编号来实现。如果数据库中该列的数据内容为Int类型,则使用该方法,否则应选择其他相类似的方法。语法格式:
public abstract int getInt(int columnIndex)
11)getLong方法:获取长整型内容
该方法用于获取查询结果中指定列的Long类型内容,通过指定列编号来实现。如果数据库中该列的数据内容为Long类型,则使用该方法,否则应选择其他相类似的方法。语法格式:
public abstract long getLong(int columnIndex)
12)getShort方法:获取短整型内容
该方法用于获取查询结果中指定列的Short类型内容,通过指定列编号来实现。如果数据库中该列的数据内容为Short类型,则使用该方法,否则应选择其他相类似的方法。语法格式:
public abstract short getShort(int columnIndex)
13)geType方法:获取数据类型
该方法用于获取查询结果中指定列的数据类型,通过指定列编号来实现。该方法从Android3.0以后才开始支持,可以通过该方法获取当前列的数据类型,然后调用不同的方法来获取数据内容。语法格式:
public abstract int getType(int columnIndex)
其中,参数columnIndex为指定列的编号,返回值为指定列的数据类型,包括以下值:
·FIELD_TYPE_NULL:空值
·FIELD_TYPE_INTEGER:整型
·FIELD_TYPE_FLOAT:浮点型
·FIELD_TYPE_STRING:字符串
·FIELD_TYPE_BLOB:二进制文件
14)moveToFirst方法:移动到第一行
该方法用于将查询结果的游标移动到第一行,也就是指向查询结果的第一条数据,常用于从头遍历整个查询结果的场合。语法格式:
public abstract boolean moveToFirst()
15)moveToNext方法:移动到下一行
该方法用于将查询结果的游标从当前行移动到下一行,也就是指向查询结果的下一条数据,常用于从头遍历整个查询结果的场合。语法格式:
public abstract boolean moveToNext()
示例:
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
Cursor cur=mydb.query(TABLE_NAME,new String[] {ID,NAME,AGE,HOME},
null,null,null,null,null);
int n=1;
String str="";
cur.moveToFirst();
do{
String name=cur.getString(1);
String age=cur.getString(2);
String home=cur.getString(3);
str=str+"第"+n+"条数据:"+name+"\t"+age+"\t"+home+"\n";
n=n+1;
}while(cur.moveToNext());
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_LONG).show();
cur.close();
}
});
16)moveToLast方法:移动到最后一行
该方法用于将查询结果的游标移动到最后一行,也就是指向查询结果的最后一条数据,常用于从头遍历整个查询结果的场合。语法格式:
public abstract boolean moveToLast()
17)moveToPosition方法:移动到指定位置
该方法用于将查询结果的游标移动到指定的行。当指定的行存在时,将返回true,否则返回false,常用于从头遍历整个查询结果的场合。语法格式:
public abstract boolean moveToPosition(int position)
其中,参数position为指定的行号。行号以0开始,依次递增。
18)moveToPrevious方法:移动到前一行
该方法用于将查询结果的游标从当前行移动到前一行,也就是指向查询结果的上一条数据,常用于从头遍历整个查询结果的场合。语法格式:
public abstract boolean moveToProvious()
示例:
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
Cursor cur=mydb.query(TABLE_NAME,new String[] {ID,NAME,AGE,HOME},
null,null,null,null,null);
String str="数据库中的数据如下:";
String name,age,home;
int n=1;
cur.moveToLast();
do{
name=cur.getString(1);
age=cur.getString(2);
home=cur.getString(3);
str=str+name+"\t"+age+"\t"+home+"\n";
n=n+1;
}while(cur.moveToPrevious());
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_LONG).show();
cur.close();
}
});
19)move方法:移动到指定偏移位置
该方法用于将查询结果的游标从当前行移动到指定偏移行。该方法以当前游标指向的行为基准,如果指定的偏移量为正,表示向后移动游标;如果指定的偏移量为负,表示向前移动游标。语法格式:
public abstract boolean move(int offset)
其中,参数offset为指定的偏移量。该方法返回值为布尔型,如果指向的数据存在返回true,否则返回false。示例:
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
mydb=openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
Cursor cur=mydb.query(TABLE_NAME,new String[] {ID,NAME,AGE,HOME},
null,null,null,null,null);
String str="数据库中的数据如下:";
String name,age,home;
int n=1;
cur.moveToFirst();
do{
name=cur.getString(1);
age=cur.getString(2);
home=cur.getString(3);
str=str+name+"\t"+age+"\t"+home+"\n";
n=n+1;
}while(cur.move(1));
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_LONG).show();
cur.close();
}
});
20)getPosition方法:获取当前位置
该方法用于获取当前游标指向查询结果的位置,以0为起点。语法格式:
public abstract int getPosition()

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659