Android数据存取
2012-04-06 09:11
197 查看
2012-02-13 17:2818人阅读评论(0)收藏举报
程序是数据的输入、处理和输出的过程,不管是操作系统还是应用程序都不可避免要用到大量的数据。由于内存容量有限,且不能长期保存数据,因此一般把他们以文件的形式保存在磁盘等持久的存储介质中。操作系统一般是以文件的形式来保存数据的,而应用程序一般是以数据库来保存数据。
在手机这种特殊设备里,也经常会存取一些数据。例如,音频文件、视频文件、图片文件和通讯录等数据。Android作为一种手机操作系统,提供了如下几种存数数据的方式:Preference(配置)、File(文件)、SQLite数据和网络,可以根据程序的实际需要选择合适的存取方式。
另外,在Android中各个应用程序组件之间是相互独立的,彼此的数据不能共享。为了实现数据的共享,Android提供了Content Provider组件来实现应用程序之间数据的共享。
一、Preference
Preference提供了一种轻量级的数据存取方法,应用场合主要是数据比较少的配置信息。它以“键-值”(是一个Map)对的方式将数据保存在一个XML配置文件中。例如,我们设置了一个手机开机问候语,可以将其以Preference方式来进行配置。
1、Preference简介
使用Preference来存取数据,用到了SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中。
调用Context.getSharedPreferences(String name,int mode)方法得到SharedPreferences接口。该方法的第一个参数是文件名称,第二个参数是操作模式。操作模式有三种:MODE_PRIVATE(私有)、MODE_WORLD_READABLE(可读)、MODE_WORLD_WRITEABLE(可写)。
SharedPreferences提供了获得数据的方法,如getString(String key,String defValue)、getInt(String key,int defValue)等。调用SharedPreferences的edit()方法返回SharedPreferences.Editor内部接口,该接口中提供了保存数据的方法,如putString(String key,String value),putInt(String key,int value)等,调用该接口的commit()方法可以将数据进行保存。SharedPreferences和SharedPreferences.Editor的常用方法如下表:
SharedPreferences常用方法
SharedPreferences.Editor常用方法
2、Preference应用实例——保存临时短信
当我们在发短信时,突然来了一个电话。我们停止发短信,去打电话。那么,当我们打完电话回来,我们发了一半的短信内容应该还在才对。这里我们通过Preference来保存临时短信内容。
创建一个Activity,在其中放置一个EditText保存短信内容,放置一个Button用于发送短信。在onCreate()中通过getSharedPreferences()方法获得SharedPreferences接口,调用接口的getString()方法,获得保存内容,将内容设置到editText中。在onStop()方法中保存内容,使用getSharedPreferences().edit()方法获得SharedPreferences.Editor接口,调用SharedPreferences.Editor的putString()方法保存短信内容,调用commit()方法提交内容。
[java]
view plaincopyprint?
public class TestPreferencesActivity
extends Activity {
private EditText myEditText;
private Button myBtn;
private static
final String TEMP_SMS = "temp_sms";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myEditText = (EditText) findViewById(R.id.EditText01);
myBtn = (Button) findViewById(R.id.Button01);
//获得SharedPreferences实例
SharedPreferences pre = getSharedPreferences(TEMP_SMS,MODE_WORLD_READABLE);
//从SharedPreferences中获得短信内容
String content = pre.getString("sms_content",
"");
//在EditText中显示短信内容
myEditText.setText(content);
}
@Override
protected void onStop() {
super.onStop();
//获得编辑器
SharedPreferences.Editor editor = getSharedPreferences(TEMP_SMS, MODE_WORLD_WRITEABLE).edit();
//将EditText中的文本内容添加到编辑器
editor.putString("sms_content", myEditText.getText().toString());
//提交编辑器内容
editor.commit();
}
}
当我们编辑一些内容,退出屏幕再返回时,发现原来的内容显示出来了。其实,它是把要保存的内容作为XML文件保存到了/data/data/packge/shared_prefs下面。
二、File
我们可以将一些数据直接以文件的形式保存在设备中。例如,一些文本文件、PDF文件、音频文件和图片等。Android提供了文件读写的方法。
通过Context.openFileInput()方法获得标准Java文件输入流(FileInputStream),通过Context.openFileOutput()方法获得标准Java文件输出流(FileOutputStream)。使用Rescources.openRawResource(R.raw.my.DataFile)方法返回InputStream。
下面通过实例演示File读写文件。创建一个Activity,在其中放置两个EditText和两个Button。第一个EditText和Button将EditText的内容写到文件名为temp.txt的文件中。第二个EditText和Button将内容从temp.txt文件中读出来显示。文件被默认保存在/data/data/package/files下面。
[java]
view plaincopyprint?
public class TestFileActivity
extends Activity {
//文件名称字符串常量
private static
final String FILE_NAME = "temp.txt";
private EditText etWrite,etRead;
private Button btnWrite,btnRead;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
etWrite = (EditText) findViewById(R.id.fileEditTextwrite);
etRead = (EditText) findViewById(R.id.fileEditTextread);
btnWrite = (Button) findViewById(R.id.fileButtonwrite);
btnRead = (Button) findViewById(R.id.fileButtonread);
//写内容
btnWrite.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
write(etWrite.getText().toString());
}
});
//读内容
btnRead.setOnClickListener(new OnClickListener() {
@Override
public
void onClick(View v) {
etRead.setText(read());
}
});
}
//写方法
private void write(String content){
try {
//实例化文件输出流
FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
//写内容
fos.write(content.getBytes());
//关闭文件流
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//读方法
private String read(){
try {
//实例化文件输入流对象
FileInputStream fis = openFileInput(FILE_NAME);
//定义缓存数组
byte[] buffer =
new byte[fis.available()];
//读到缓冲区
fis.read(buffer);
return new String(buffer);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
三、SQLite
Android通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎。
SQLIte数据库不像其他数据库(如Oracle),它没有服务器进程。所有的内容包含在同一个单文件中。该文件是跨平台的,可以自由复制。基于其自身的先天优势,SQLite在嵌入式领域得到了广泛应用。Android也没有重复发明“轮子”,而是直接使用了SQLite数据库。
1、SQLiteDatabase
Android提供了创建和使用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供了更简洁的功能。在Android的SDK目录下有个sqlite3工具,我们可以使用它来创建数据库、创建表和执行一些SQL语句。
SQLiteDatabase常用方法
1)、打开或者创建数据库
可以使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)打开或创建一个数据库,该方法的第一个参数是数据库创建路径,注意这个路径一定是数据库全路径。例如:/data/data/package/database/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。
[java]
view plaincopyprint?
SQLiteDatabase.openOrCreateDatabase("/data/data/mx.android.ch09/database/temp.db",
null);
3)、插入数据
有两种方法:一种是调用SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,该方法的第一个参数是表名称,第二个参数的空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;另一种方法是编写插入数据的SQL语句、直接调用SQLiteDatabase的execSQL()方法来执行。
[java]
view plaincopyprint?
public void insert1(SQLiteDatabase db){
String sql = "insert into UserTbl(username,password) values ('mx','123')";
db.execSQL(sql);
}
4)、删除数据
有两种方法:一种的调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法,该方法的第一个参数是表名称,第二个参数是删除条件,第三个参数的删除条件值数组;另一种方法是编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。
[java]
view plaincopyprint?
public void delete1(SQLiteDatabase db){
String sql = "delete from UserTbl where _id = 1";
db.execSQL(sql);
}
5)、查询数据
下面看一个查询方法。
[java]
view plaincopyprint?
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,
String groupBy,String having,String orderBy,String limit)。
6)、修改数据
有两种方式:一种是调用SQLiteDatabase的update(String table,ContentValues values,String whereClause,String[] whereArgs)方法。该方法的第一个参数是表名称,第二个参数是更新列ContentValues类型的键-值对(Map),第三个参数是更新条件(where子句),第四个参数是更新条件的值数组。二是编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。
[java]
view plaincopyprint?
public void update1(SQLiteDatabase db){
String sql = "update UserTbl set password = 321 where _id = 1";
db.execSQL(sql);
}
public void update2(SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put("password", "321");
String whereClause = "_id=?";
String[] whereArgs = {String.valueOf(1)};
db.update("UserTbl", values, whereClause, whereArgs);
}
3、SQLite应用实例——收藏管理
通过使用SQLite对自己比较喜欢的网站进行收藏管理。收藏信息包括编号、网站名称、URL和网站内容描述,可以实现的功能有添加、删除和浏览等。
1)、创建操作数据库的工具类DBHelper,该类继承SQLiteOpenHelper。覆盖onCreate()和onUpgrade()方法,并添加inisert()、del()、query()方法,分别用来添加、删除和查询数据。
[java]
view plaincopyprint?
public class DBHelper
extends SQLiteOpenHelper {
//数据库名称
private static
final String DB_NAME = "coll.db";
//表名称
private static
final String TBL_NAME = "CollTbl";
//创建表SQL语句
private static
final String CREATE_TBL = "create table CollTbl(_id integer primary key " +
"autoincrement,name text,url text,desc text)";
//SQLiteDatabase实例
private SQLiteDatabase db;
//构造方法
public DBHelper(Context c) {
super(c, DB_NAME,
null, 2);
}
//创建表
@Override
public void onCreate(SQLiteDatabase db) {
this.db = db;
db.execSQL(CREATE_TBL);
}
//插入方法
public void insert(ContentValues values){
//获得SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
//插入
db.insert(TBL_NAME, null, values);
db.close();
}
//查询方法
public Cursor query(){
//获得SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
//查询获得Cursor
Cursor c = db.query(TBL_NAME,
null, null, null,
null, null,
null);
return c;
}
//删除方法
public void delete(int id){
if(db == null)
db = getWritableDatabase();
db.delete(TBL_NAME, "_id=?",
new String[]{String.valueOf(id)});
}
//关闭数据库
public void close(){
if(db != null)
db.close();
}
@Override
public void onUpgrade(SQLiteDatabase db,
int oldVersion, int newVersion) {
}
}
3)、创建AddActivity,声明用到的组件类EditText和Button,在onCreate()方法中进行初始化,响应Button的单击事件方法,该方法从编辑框中获得数据项,封装到ContentValues对象中,调用DBHelper进行保存,之后跳转到显示收藏记录QueryActivity界面。
[java]
view plaincopyprint?
public class AddActivity
extends Activity {
//声明EditText实例
private EditText et1,et2,et3;
//声明Button实例
private Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add);
this.setTitle("添加收藏信息");
et1 = (EditText) findViewById(R.id.s_EditTextName);
et2 = (EditText) findViewById(R.id.s_EditTextURL);
et3 = (EditText) findViewById(R.id.s_EditTextDesc);
b1 = (Button) findViewById(R.id.s_ButtonAdd);
b1.setOnClickListener(new OnClickListener() {
@Override
public
void onClick(View arg0) {
String name = et1.getText().toString();
String url = et2.getText().toString();
String desc = et3.getText().toString();
//内容值实例
ContentValues values = new ContentValues();
values.put("name", name);
values.put("url", url);
values.put("desc", desc);
//实例化数据库帮助类
DBHelper helper = new DBHelper(getApplicationContext());
//插入数据
helper.insert(values);
//实例化Intent
Intent intent = new Intent(AddActivity.this,QueryActivity.class);
startActivity(intent);
}
});
}
}
[java]
view plaincopyprint?
public class QueryActivity
extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.row);
this.setTitle("浏览收藏信息");
//实例化数据库帮助类
final DBHelper helper =
new DBHelper(this);
//查询获得游标
Cursor c = helper.query();
//列表项数组
String[] from = {"_id","name","url","desc"};
//列表项ID
int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
//适配器
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.row,c,from,to);
//列表视图
ListView listView = getListView();
//为列表视图添加适配器
listView.setAdapter(adapter);
//提示对话框
final AlertDialog.Builder builder =
new AlertDialog.Builder(this);
//为ListView设置单击监听器
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2,
long arg3) {
final long temp = arg3;
builder.setMessage("真的要删除该记录吗?").setPositiveButton("是",
new DialogInterface.OnClickListener() {
@Override
public
void onClick(DialogInterface dialog,
int which) {
//删除数据
helper.delete((int)temp);
//重新查询
Cursor c = helper.query();
String[] from = {"_id","name","url","desc"};
int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(getApplicationContext(),R.layout.row,c,from,to);
ListView listView = getListView();
listView.setAdapter(adapter);
}
}).setNegativeButton("否",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
});
//创建提示对话框
AlertDialog ad = builder.create();
ad.show();
}
});
helper.close();
}
}
程序是数据的输入、处理和输出的过程,不管是操作系统还是应用程序都不可避免要用到大量的数据。由于内存容量有限,且不能长期保存数据,因此一般把他们以文件的形式保存在磁盘等持久的存储介质中。操作系统一般是以文件的形式来保存数据的,而应用程序一般是以数据库来保存数据。
在手机这种特殊设备里,也经常会存取一些数据。例如,音频文件、视频文件、图片文件和通讯录等数据。Android作为一种手机操作系统,提供了如下几种存数数据的方式:Preference(配置)、File(文件)、SQLite数据和网络,可以根据程序的实际需要选择合适的存取方式。
另外,在Android中各个应用程序组件之间是相互独立的,彼此的数据不能共享。为了实现数据的共享,Android提供了Content Provider组件来实现应用程序之间数据的共享。
一、Preference
Preference提供了一种轻量级的数据存取方法,应用场合主要是数据比较少的配置信息。它以“键-值”(是一个Map)对的方式将数据保存在一个XML配置文件中。例如,我们设置了一个手机开机问候语,可以将其以Preference方式来进行配置。
1、Preference简介
使用Preference来存取数据,用到了SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中。
调用Context.getSharedPreferences(String name,int mode)方法得到SharedPreferences接口。该方法的第一个参数是文件名称,第二个参数是操作模式。操作模式有三种:MODE_PRIVATE(私有)、MODE_WORLD_READABLE(可读)、MODE_WORLD_WRITEABLE(可写)。
SharedPreferences提供了获得数据的方法,如getString(String key,String defValue)、getInt(String key,int defValue)等。调用SharedPreferences的edit()方法返回SharedPreferences.Editor内部接口,该接口中提供了保存数据的方法,如putString(String key,String value),putInt(String key,int value)等,调用该接口的commit()方法可以将数据进行保存。SharedPreferences和SharedPreferences.Editor的常用方法如下表:
SharedPreferences常用方法
方法名称 | 方法描述 |
edit() | 返回SharedPreferences的内部接口SharedPreferences.Editor |
contains(String key) | 判断是否包含该键值 |
getAll() | 返回所有配置信息Map |
getBoolean(String key,boolean defValue) | 获得一个Boolean值 |
getFolat(String key,float defValue) | 获得一个float值 |
getInt(String key,int defValue) | 获得一个int值 |
getLong(String key,long defValue) | 获得一个long值 |
getString(String key,String defValue) | 获得一个String值 |
方法名称 | 方法描述 |
clear() | 清除所有值 |
commit() | 保存 |
getAll() | 返回所有配置信息Map |
putBoolean(String key,boolean value) | 保存一个Boolean值 |
putFloat(String key,float value) | 保存一个float值 |
putInt(String key,int value) | 保存一个int值 |
putLong(String key,long value) | 保存一个long值 |
putString(String key,String value) | 保存一个String值 |
remove(String key) | 删除该键对应的值 |
当我们在发短信时,突然来了一个电话。我们停止发短信,去打电话。那么,当我们打完电话回来,我们发了一半的短信内容应该还在才对。这里我们通过Preference来保存临时短信内容。
创建一个Activity,在其中放置一个EditText保存短信内容,放置一个Button用于发送短信。在onCreate()中通过getSharedPreferences()方法获得SharedPreferences接口,调用接口的getString()方法,获得保存内容,将内容设置到editText中。在onStop()方法中保存内容,使用getSharedPreferences().edit()方法获得SharedPreferences.Editor接口,调用SharedPreferences.Editor的putString()方法保存短信内容,调用commit()方法提交内容。
[java]
view plaincopyprint?
public class TestPreferencesActivity
extends Activity {
private EditText myEditText;
private Button myBtn;
private static
final String TEMP_SMS = "temp_sms";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myEditText = (EditText) findViewById(R.id.EditText01);
myBtn = (Button) findViewById(R.id.Button01);
//获得SharedPreferences实例
SharedPreferences pre = getSharedPreferences(TEMP_SMS,MODE_WORLD_READABLE);
//从SharedPreferences中获得短信内容
String content = pre.getString("sms_content",
"");
//在EditText中显示短信内容
myEditText.setText(content);
}
@Override
protected void onStop() {
super.onStop();
//获得编辑器
SharedPreferences.Editor editor = getSharedPreferences(TEMP_SMS, MODE_WORLD_WRITEABLE).edit();
//将EditText中的文本内容添加到编辑器
editor.putString("sms_content", myEditText.getText().toString());
//提交编辑器内容
editor.commit();
}
}
[html] view plaincopyprint? <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/EditText01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/EditText01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" /> </LinearLayout>
当我们编辑一些内容,退出屏幕再返回时,发现原来的内容显示出来了。其实,它是把要保存的内容作为XML文件保存到了/data/data/packge/shared_prefs下面。
二、File
我们可以将一些数据直接以文件的形式保存在设备中。例如,一些文本文件、PDF文件、音频文件和图片等。Android提供了文件读写的方法。
通过Context.openFileInput()方法获得标准Java文件输入流(FileInputStream),通过Context.openFileOutput()方法获得标准Java文件输出流(FileOutputStream)。使用Rescources.openRawResource(R.raw.my.DataFile)方法返回InputStream。
下面通过实例演示File读写文件。创建一个Activity,在其中放置两个EditText和两个Button。第一个EditText和Button将EditText的内容写到文件名为temp.txt的文件中。第二个EditText和Button将内容从temp.txt文件中读出来显示。文件被默认保存在/data/data/package/files下面。
[java]
view plaincopyprint?
public class TestFileActivity
extends Activity {
//文件名称字符串常量
private static
final String FILE_NAME = "temp.txt";
private EditText etWrite,etRead;
private Button btnWrite,btnRead;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
etWrite = (EditText) findViewById(R.id.fileEditTextwrite);
etRead = (EditText) findViewById(R.id.fileEditTextread);
btnWrite = (Button) findViewById(R.id.fileButtonwrite);
btnRead = (Button) findViewById(R.id.fileButtonread);
//写内容
btnWrite.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
write(etWrite.getText().toString());
}
});
//读内容
btnRead.setOnClickListener(new OnClickListener() {
@Override
public
void onClick(View v) {
etRead.setText(read());
}
});
}
//写方法
private void write(String content){
try {
//实例化文件输出流
FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
//写内容
fos.write(content.getBytes());
//关闭文件流
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//读方法
private String read(){
try {
//实例化文件输入流对象
FileInputStream fis = openFileInput(FILE_NAME);
//定义缓存数组
byte[] buffer =
new byte[fis.available()];
//读到缓冲区
fis.read(buffer);
return new String(buffer);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
[html] view plaincopyprint? <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/fileEditTextwrite" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Button android:id="@+id/fileButtonwrite" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Write" /> <EditText android:id="@+id/fileEditTextread" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Button android:id="@+id/fileButtonread" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Read" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/fileEditTextwrite" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Button android:id="@+id/fileButtonwrite" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Write" /> <EditText android:id="@+id/fileEditTextread" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Button android:id="@+id/fileButtonread" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Read" /> </LinearLayout>
三、SQLite
Android通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎。
SQLIte数据库不像其他数据库(如Oracle),它没有服务器进程。所有的内容包含在同一个单文件中。该文件是跨平台的,可以自由复制。基于其自身的先天优势,SQLite在嵌入式领域得到了广泛应用。Android也没有重复发明“轮子”,而是直接使用了SQLite数据库。
1、SQLiteDatabase
Android提供了创建和使用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供了更简洁的功能。在Android的SDK目录下有个sqlite3工具,我们可以使用它来创建数据库、创建表和执行一些SQL语句。
SQLiteDatabase常用方法
方法名称 | 方法描述 |
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) | 打开或创建数据库 |
insert(Sting table,String nullColumnHack,ContentValues values) | 添加一条记录 |
delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 |
query(String table,String[] columns,String selection,String[] selectionArgs, String groupBy,String having,String orderBy) | 查询记录 |
update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 |
execSQL(String sql) | 执行一条SQL语句 |
close() | 关闭数据库 |
可以使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)打开或创建一个数据库,该方法的第一个参数是数据库创建路径,注意这个路径一定是数据库全路径。例如:/data/data/package/database/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。
[java]
view plaincopyprint?
SQLiteDatabase.openOrCreateDatabase("/data/data/mx.android.ch09/database/temp.db",
null);
[java] view plaincopyprint? public void createTable(SQLiteDatabase db){ //创建SQL语句 String sql = "create table UserTbl(_id integer primary key autoincrement,username text,password text)"; //执行SQL语句 db.execSQL(sql); } public void createTable(SQLiteDatabase db){ //创建SQL语句 String sql = "create table UserTbl(_id integer primary key autoincrement,username text,password text)"; //执行SQL语句 db.execSQL(sql); }
3)、插入数据
有两种方法:一种是调用SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,该方法的第一个参数是表名称,第二个参数的空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;另一种方法是编写插入数据的SQL语句、直接调用SQLiteDatabase的execSQL()方法来执行。
[java]
view plaincopyprint?
public void insert1(SQLiteDatabase db){
String sql = "insert into UserTbl(username,password) values ('mx','123')";
db.execSQL(sql);
}
[java] view plaincopyprint? public void insert2(SQLiteDatabase db){ //实例化常量值 ContentValues cv = new ContentValues(); cv.put("username","mx"); cv.put("password", "123"); db.insert("UserTbl",null, cv); } public void insert2(SQLiteDatabase db){ //实例化常量值 ContentValues cv = new ContentValues(); cv.put("username","mx"); cv.put("password", "123"); db.insert("UserTbl",null, cv); }
4)、删除数据
有两种方法:一种的调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法,该方法的第一个参数是表名称,第二个参数是删除条件,第三个参数的删除条件值数组;另一种方法是编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。
[java]
view plaincopyprint?
public void delete1(SQLiteDatabase db){
String sql = "delete from UserTbl where _id = 1";
db.execSQL(sql);
}
[java] view plaincopyprint? public void delete2(SQLiteDatabase db){ String whereClause = "_id=?"; String[] whereArgs = {String.valueOf(1)}; db.delete("UserTbl", whereClause, whereArgs); } public void delete2(SQLiteDatabase db){ String whereClause = "_id=?"; String[] whereArgs = {String.valueOf(1)}; db.delete("UserTbl", whereClause, whereArgs); }
5)、查询数据
下面看一个查询方法。
[java]
view plaincopyprint?
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,
String groupBy,String having,String orderBy,String limit)。
[java] view plaincopyprint? public void query(SQLiteDatabase db){ //查询获得游标 Cursor c = db.query("UserTbl", null, null, null, null, null, null); //判断游标是否为空 if(c.moveToFirst()){ //遍历游标 for (int i = 0; i < c.getCount(); i++) { c.move(i); //获得Id int id = c.getInt(0); //获得用户名 String username = c.getString(1); //获得密码 String passwrod = c.getString(2); //输出用户信息 System.out.println(id + ":" + username + ":" + passwrod); } } } public void query(SQLiteDatabase db){ //查询获得游标 Cursor c = db.query("UserTbl", null, null, null, null, null, null); //判断游标是否为空 if(c.moveToFirst()){ //遍历游标 for (int i = 0; i < c.getCount(); i++) { c.move(i); //获得Id int id = c.getInt(0); //获得用户名 String username = c.getString(1); //获得密码 String passwrod = c.getString(2); //输出用户信息 System.out.println(id + ":" + username + ":" + passwrod); } } }
6)、修改数据
有两种方式:一种是调用SQLiteDatabase的update(String table,ContentValues values,String whereClause,String[] whereArgs)方法。该方法的第一个参数是表名称,第二个参数是更新列ContentValues类型的键-值对(Map),第三个参数是更新条件(where子句),第四个参数是更新条件的值数组。二是编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。
[java]
view plaincopyprint?
public void update1(SQLiteDatabase db){
String sql = "update UserTbl set password = 321 where _id = 1";
db.execSQL(sql);
}
public void update2(SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put("password", "321");
String whereClause = "_id=?";
String[] whereArgs = {String.valueOf(1)};
db.update("UserTbl", values, whereClause, whereArgs);
}
[java] view plaincopyprint? public class TestSQLiteActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sqlite); //实例化数据库帮助类 MyDBHelper helper = new MyDBHelper(this); //插入 helper.insert(); //查询 helper.query(); } //数据库帮助类 class MyDBHelper extends SQLiteOpenHelper{ //创建SQL语句 private static final String CREATE_TABLE_SQL = "create table TempTb1(_id integer,name text)"; //SQLiteDatabase实例 private SQLiteDatabase db; //构造方法 public MyDBHelper(Context c) { super(c, "test.db", null, 2); } @Override public void onCreate(SQLiteDatabase db) { //创建表 db.execSQL(CREATE_TABLE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } //插入方法 private void insert(){ //插入SQL语句 String sql = "insert into TempTb1(_id,name) values(1,'mx')"; //执行插入 getWritableDatabase().execSQL(sql); } //查询方法 private void query(){ //获得查询游标 Cursor c = getWritableDatabase().query("TempTb1", null, null, null, null, null, null); //判断游标是否为空 if(c.moveToFirst()){ //遍历游标 for (int i = 0; i < c.getCount(); i++) { c.move(i); int id = c.getInt(0); String name = c.getString(1); System.out.println(id + ":" + name); } } } } } public class TestSQLiteActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sqlite); //实例化数据库帮助类 MyDBHelper helper = new MyDBHelper(this); //插入 helper.insert(); //查询 helper.query(); } //数据库帮助类 class MyDBHelper extends SQLiteOpenHelper{ //创建SQL语句 private static final String CREATE_TABLE_SQL = "create table TempTb1(_id integer,name text)"; //SQLiteDatabase实例 private SQLiteDatabase db; //构造方法 public MyDBHelper(Context c) { super(c, "test.db", null, 2); } @Override public void onCreate(SQLiteDatabase db) { //创建表 db.execSQL(CREATE_TABLE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } //插入方法 private void insert(){ //插入SQL语句 String sql = "insert into TempTb1(_id,name) values(1,'mx')"; //执行插入 getWritableDatabase().execSQL(sql); } //查询方法 private void query(){ //获得查询游标 Cursor c = getWritableDatabase().query("TempTb1", null, null, null, null, null, null); //判断游标是否为空 if(c.moveToFirst()){ //遍历游标 for (int i = 0; i < c.getCount(); i++) { c.move(i); int id = c.getInt(0); String name = c.getString(1); System.out.println(id + ":" + name); } } } } }
3、SQLite应用实例——收藏管理
通过使用SQLite对自己比较喜欢的网站进行收藏管理。收藏信息包括编号、网站名称、URL和网站内容描述,可以实现的功能有添加、删除和浏览等。
1)、创建操作数据库的工具类DBHelper,该类继承SQLiteOpenHelper。覆盖onCreate()和onUpgrade()方法,并添加inisert()、del()、query()方法,分别用来添加、删除和查询数据。
[java]
view plaincopyprint?
public class DBHelper
extends SQLiteOpenHelper {
//数据库名称
private static
final String DB_NAME = "coll.db";
//表名称
private static
final String TBL_NAME = "CollTbl";
//创建表SQL语句
private static
final String CREATE_TBL = "create table CollTbl(_id integer primary key " +
"autoincrement,name text,url text,desc text)";
//SQLiteDatabase实例
private SQLiteDatabase db;
//构造方法
public DBHelper(Context c) {
super(c, DB_NAME,
null, 2);
}
//创建表
@Override
public void onCreate(SQLiteDatabase db) {
this.db = db;
db.execSQL(CREATE_TBL);
}
//插入方法
public void insert(ContentValues values){
//获得SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
//插入
db.insert(TBL_NAME, null, values);
db.close();
}
//查询方法
public Cursor query(){
//获得SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
//查询获得Cursor
Cursor c = db.query(TBL_NAME,
null, null, null,
null, null,
null);
return c;
}
//删除方法
public void delete(int id){
if(db == null)
db = getWritableDatabase();
db.delete(TBL_NAME, "_id=?",
new String[]{String.valueOf(id)});
}
//关闭数据库
public void close(){
if(db != null)
db.close();
}
@Override
public void onUpgrade(SQLiteDatabase db,
int oldVersion, int newVersion) {
}
}
[html] view plaincopyprint? <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:layout_gravity="center_vertical" > <TextView android:text="网站名称" android:id="@+id/s_TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:text="" android:id="@+id/s_EditTextName" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:text="URL" android:id="@+id/s_TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:text="" android:id="@+id/s_EditTextURL" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:text="网站描述" android:id="@+id/s_TextView03" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:text="" android:id="@+id/s_EditTextDesc" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:text="添加" android:id="@+id/s_ButtonAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:layout_gravity="center_vertical" > <TextView android:text="网站名称" android:id="@+id/s_TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:text="" android:id="@+id/s_EditTextName" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:text="URL" android:id="@+id/s_TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:text="" android:id="@+id/s_EditTextURL" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:text="网站描述" android:id="@+id/s_TextView03" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:text="" android:id="@+id/s_EditTextDesc" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:text="添加" android:id="@+id/s_ButtonAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
3)、创建AddActivity,声明用到的组件类EditText和Button,在onCreate()方法中进行初始化,响应Button的单击事件方法,该方法从编辑框中获得数据项,封装到ContentValues对象中,调用DBHelper进行保存,之后跳转到显示收藏记录QueryActivity界面。
[java]
view plaincopyprint?
public class AddActivity
extends Activity {
//声明EditText实例
private EditText et1,et2,et3;
//声明Button实例
private Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add);
this.setTitle("添加收藏信息");
et1 = (EditText) findViewById(R.id.s_EditTextName);
et2 = (EditText) findViewById(R.id.s_EditTextURL);
et3 = (EditText) findViewById(R.id.s_EditTextDesc);
b1 = (Button) findViewById(R.id.s_ButtonAdd);
b1.setOnClickListener(new OnClickListener() {
@Override
public
void onClick(View arg0) {
String name = et1.getText().toString();
String url = et2.getText().toString();
String desc = et3.getText().toString();
//内容值实例
ContentValues values = new ContentValues();
values.put("name", name);
values.put("url", url);
values.put("desc", desc);
//实例化数据库帮助类
DBHelper helper = new DBHelper(getApplicationContext());
//插入数据
helper.insert(values);
//实例化Intent
Intent intent = new Intent(AddActivity.this,QueryActivity.class);
startActivity(intent);
}
});
}
}
[html] view plaincopyprint? <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:layout_gravity="center_vertical" > <TextView android:id="@+id/r_text0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="10px" /> <TextView android:id="@+id/r_text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="10px" /> <TextView android:id="@+id/r_text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="10px" /> <TextView android:id="@+id/r_text3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10px" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:layout_gravity="center_vertical" > <TextView android:id="@+id/r_text0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="10px" /> <TextView android:id="@+id/r_text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="10px" /> <TextView android:id="@+id/r_text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="10px" /> <TextView android:id="@+id/r_text3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10px" /> </LinearLayout>
[java]
view plaincopyprint?
public class QueryActivity
extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.row);
this.setTitle("浏览收藏信息");
//实例化数据库帮助类
final DBHelper helper =
new DBHelper(this);
//查询获得游标
Cursor c = helper.query();
//列表项数组
String[] from = {"_id","name","url","desc"};
//列表项ID
int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
//适配器
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.row,c,from,to);
//列表视图
ListView listView = getListView();
//为列表视图添加适配器
listView.setAdapter(adapter);
//提示对话框
final AlertDialog.Builder builder =
new AlertDialog.Builder(this);
//为ListView设置单击监听器
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2,
long arg3) {
final long temp = arg3;
builder.setMessage("真的要删除该记录吗?").setPositiveButton("是",
new DialogInterface.OnClickListener() {
@Override
public
void onClick(DialogInterface dialog,
int which) {
//删除数据
helper.delete((int)temp);
//重新查询
Cursor c = helper.query();
String[] from = {"_id","name","url","desc"};
int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(getApplicationContext(),R.layout.row,c,from,to);
ListView listView = getListView();
listView.setAdapter(adapter);
}
}).setNegativeButton("否",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
});
//创建提示对话框
AlertDialog ad = builder.create();
ad.show();
}
});
helper.close();
}
}
相关文章推荐
- 第60章、数据文件存取至储存卡(从零开始学Android)
- 【JAVA】java中实现map集合的数据存取详解三种方法。Android程序员也是要会写的
- Android MMS模块数据存取
- SharedPreferences数据存取操作,android引导页一次执行的方法。
- 使用云(BAE)实现android应用数据的远程存取(MySQL)
- android中的数据存取-方式三:SQLite
- Android开发学习笔记:数据存取之SQLite浅析
- Android 中的数据存取方式之一: Preference(配置) .
- Android:使用SharedPreferences存取数据
- android存取数据方式:文件、SharedPreferences
- Android内存和SD卡的数据存取
- Android MMS模块数据存取
- Android开发——补充SharedPreferences存储(跨Activity存取数据)
- [置顶] 【JAVA】java中实现map集合的数据存取详解三种方法。Android程序员也是要会写的
- Android_Preference存取数据
- 说说在 Android 中如何使用文件存取数据
- Android_Preference存取数据
- 【android】使用SharedPreferences存取复杂数据
- 彩信的在android里是如何存储的 Android MMS模块数据存取
- Android开源: 快用Parceler来优雅的进行Bundle数据存取!