手持终端
Eclipse平台下Android开发环境的搭建
PhoneGap配置到Eclipse开发环境
使用PhoneGap开发Android应用程序
PhoneGap3.0以上版本配置到Eclipse开发环境
使用PhoneGap3.0版本开发Android应用程序
PhoneGap3.0的第三方Android插件
Cordova配置到Android Studio开发环境
Android系统基本架构
Android的字符串颜色图片样式
Android的常用控件及菜单
Android的消息提示及传递
Android系统的组件通信
Android系统的Service
Android的广播消息接收
Android的数据存储与访问
Android系统的网络应用
Android图形图像处理
Android的Fragment框架
Android系统的并发编程
Java源文件结构与保留字
Java语言的数据类型与变量
Java的运算符与流程控制
Java语言的数组及操作
Java面向对象编程
Java的常用类
Android开发常用工具及命令
Android应用程序权限管理
Android系统提供的R类内置资源
Android系统的控件类及其方法
Android系统的菜单类及其方法
Android系统的对话框
Android应用程序模型及组件
Android的绘图类及方法
Android系统的动画效果
Android的数据库操作
Android的多媒体功能
Android系统照相机的使用
Android的文本朗读TTS
获取Android系统信息
Android系统的电话操作
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()