Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库
2012-04-02 09:59
696 查看
SQLite数据库简单的认识
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha诞生于2000年5月.
至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
SQLite特性
下面是访问SQLite官方网站: http://www.sqlite. org/ 时第一眼看到关于SQLite的特性.
1. ACID事务
2. 零配置 – 无需安装和管理配置
3. 储存在单一磁盘文件中的一个完整的数据库
4. 数据库文件可以在不同字节顺序的机器间自由的共享
5. 支持数据库大小至2TB
6. 足够小, 大致3万行C代码, 250K
7. 比一些流行的数据库在大部分普通数据库操作要快
8. 简单, 轻松的API
9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定
10. 良好注释的源代码, 并且有着90%以上的测试覆盖率
11. 独立: 没有额外依赖
12. Source完全的Open, 你可以用于任何用途, 包括出售它
13. 支持多种开发语言,C, PHP, Perl, Java, ASP .NET,Python
下面我以一个完整的Demo例子来展示对SQLite数据库操作,包括对数据库表的增、删、改、查等基本操作。下面的一个截图是该演示Demo的项目框架图:
通过上面的截图可以看到该项目src目录下包含两个类:MainActivity.java 和 MySQLiteOpenHelper.java 。其中MySQLiteOpenHelper.java是对数据库操作辅助类。
布局文件main.xml的代码:
[c-sharp] view
plaincopy
<?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">
<TextView android:id="@+id/tv_title"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="Hello, Welcome to Andy's blog!" android:textSize="16sp"/>
<Button android:id="@+id/newTable" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="1.新建数据表"/>
<Button android:id="@+id/addOne" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="2.插入一条记录"/>
<Button android:id="@+id/query" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="3.查询数据库"/>
<Button android:id="@+id/editOne" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="4.修改一条记录"/>
<Button android:id="@+id/deleteOne" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="5.删除一条记录"/>
<Button android:id="@+id/deleteTable" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="6.删除数据表"/>
<TextView android:id="@+id/tv_result"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="测试显示的结果" android:textSize="16sp"/>
</LinearLayout>
MainActivity.java代码:
[c-sharp] view
plaincopy
package com.andyidea.sqlite;
import java.io.File;
import java.io.IOException;
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.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btn_newTable,btn_addOne,btn_query,
btn_editOne,btn_deleteOne,btn_deleteTable;
private TextView tv;
private MySQLiteOpenHelper myOpenHelper;
private SQLiteDatabase sqlitedb;
//----以下两个成员变量是针对在SD卡中存储数据库文件使用----
//private File path = new File("/sdcard/dbfile"); //数据库文件目录
//private File f = new File("/sdcard/dbfile/AndyDemo.db"); //数据库文件
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initializeViews();
//实例化默认数据库辅助操作对象
myOpenHelper = new MySQLiteOpenHelper(this);
//----如要在SD卡中创建数据库文件,先做如下的判断和创建相对应的目录和文件----
//if(!path.exists()){ //判断目录是否存在
// path.mkdirs(); //创建目录
//}
//if(!f.exists()){ //判断文件是否存在
// try{
// f.createNewFile(); //创建文件
// }catch(IOException e){
// e.printStackTrace();
// }
//}
}
/**
* 初始化UI界面
*/
private void initializeViews(){
tv = (TextView)findViewById(R.id.tv_result);
btn_newTable = (Button)findViewById(R.id.newTable);
btn_addOne = (Button)findViewById(R.id.addOne);
btn_query = (Button)findViewById(R.id.query);
btn_editOne = (Button)findViewById(R.id.editOne);
btn_deleteOne = (Button)findViewById(R.id.deleteOne);
btn_deleteTable = (Button)findViewById(R.id.deleteTable);
btn_newTable.setOnClickListener(new ClickEvent());
btn_addOne.setOnClickListener(new ClickEvent());
btn_query.setOnClickListener(new ClickEvent());
btn_editOne.setOnClickListener(new ClickEvent());
btn_deleteOne.setOnClickListener(new ClickEvent());
btn_deleteTable.setOnClickListener(new ClickEvent());
}
class ClickEvent implements OnClickListener{
@Override
public void onClick(View v) {
try{
//[1]--如果是在默认的路径下创建数据库,那么实例化sqlitedb的操作如下
sqlitedb = myOpenHelper.getWritableDatabase(); //实例化数据库
//[2]--如果是在SD卡中创建数据库,那么实例化sqlitedb的操作如下
//sqlitedb = SQLiteDatabase.openOrCreateDatabase(f, null);
if(v == btn_newTable){ //1.新建数据表
String TABLE_NAME = "andy";
String ID = "id";
String TEXT = "text";
String str_sql2 = "CREATE TABLE " + TABLE_NAME + "(" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT
+ " text );";
sqlitedb.execSQL(str_sql2);
tv.setText("新建数据表成功!");
}else if(v == btn_addOne){ //2.插入一条记录
//----第1种插入数据的方法----
//ContentValues是一个哈希表HashMap,key值是对应数据表中字段名称,
//value值是字段的值。可以通过ContentValues的put方法把数据存放到
//ContentValues对象中,然后把数据插入到相对应的数据表中。
ContentValues cv = new ContentValues();
cv.put(MySQLiteOpenHelper.TEXT, "新数据");
sqlitedb.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
//db.insert(String table, String nullColumnHack, ContentValues values);方法解说
//public long insert (String table, String nullColumnHack, ContentValues values)
//该方法是向数据表中插入一条记录
//[1]参数table:需要插入操作的表名
//[2]参数nullColumnHack:默认null即可,若在插入一行数据时,若没有指定某列的值,
// 则默认使用null值传入。
//[3]参数values:插入的数据
//----第2种插入数据的方法----
// String INSERT_DATA =
// "INSERT INTO andy (id,text) values (1, '第2种插入数据的方法')";
// sqlitedb.execSQL(INSERT_DATA);
tv.setText("添加新数据成功!");
}else if(v == btn_query){ //3.查询数据库
Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+MySQLiteOpenHelper.TABLE_NAME, null);
if(cur != null){
String temp = "";
int i = 0;
while(cur.moveToNext()){
temp += cur.getString(0); //0代表数据列的第一列,即id
temp += cur.getString(1); //1代表数据列的第二列,即text
i++;
temp += "/n"; //定义显示数据的格式,一行一个数据
}
tv.setText(temp);
}
}else if(v == btn_editOne){ //4.修改一条记录
//----第1种方式修改数据----
ContentValues cv = new ContentValues();
cv.put(MySQLiteOpenHelper.TEXT, "更新后的数据");
sqlitedb.update("andy", cv, "id " + "=" + Integer.toString(1), null);
//[1]参数table:需要操作的表名
//[2]参数values:ContentValues
//[3]参数whereClause:更新的条件
//[4]参数whereArgs:更新条件对应的值
//----第2种方式修改数据----
// String UPDATA_DATA =
// "UPDATE andy SET text='通过SQL语句来修改数据' WHERE id=1";
// sqlitedb.execSQL(UPDATA_DATA);
tv.setText("修改数据成功!");
}else if(v == btn_deleteOne){ //5.删除一条记录
//----第1种方式删除数据----
sqlitedb.delete("andy", MySQLiteOpenHelper.ID + "= 1", null);
//public int delete(String table, String whereClause, String[] whereArgs)解说
//[1]参数table:需要操作的表名
//[2]参数whereClause:删除的条件
//[3]参数whereArgs:删除条件对应的值
//----第2种方式删除数据----
//String DELETE_DATA = "DELETE FROM andy WHERE id=1";
//sqlitedb.execSQL(DELETE_DATA);
tv.setText("删除数据成功!");
}else if(v == btn_deleteTable){ //6.删除数据表
sqlitedb.execSQL("DROP TABLE andy");
tv.setText("删除数据表成功!");
}
}catch(Exception e){
tv.setText("操作失败");
}finally{
sqlitedb.close();
}
}
}
}
MySQLiteOpenHelper辅助器类代码:
[c-sharp] view
plaincopy
package com.andyidea.sqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* 此类继承了SQLiteOpenHelper抽象类,是一个辅助器类,需要
* 一个构造函数和重写两个方法。
* @author Andy
*/
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "AndyDemo.db"; //数据库名
public static final int VERSION = 1; //版本号
public static final String TABLE_NAME = "andy"; //表名
public static final String ID = "id";
public static final String TEXT = "text";
public MySQLiteOpenHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
/**
* 在数据库第一次生成的时候会调用这个方法,同时我们在这个方法里边生成数据库表
*/
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据表的操作
String strSQL = "CREATE TABLE " + TABLE_NAME + "(" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );";
db.execSQL(strSQL);
}
/**
* 更新或者升级数据库的时候会自动调用这个方法,一般我们会在这个方法中
* 删除数据表,然后再创建新的数据表操作。
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("AndyDemo", "onUpgrade");
}
}
当我们需要把数据库创建在SDCard中时,需要在AndroidManifest.xml文件中添加对SDCard操作的权限,如下:
[c-sharp] view
plaincopy
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
通过以上步骤的操作,对SQLite数据库的操作有了大概的认识。下面我们来看看程序运行的效果。
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha诞生于2000年5月.
至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
SQLite特性
下面是访问SQLite官方网站: http://www.sqlite. org/ 时第一眼看到关于SQLite的特性.
1. ACID事务
2. 零配置 – 无需安装和管理配置
3. 储存在单一磁盘文件中的一个完整的数据库
4. 数据库文件可以在不同字节顺序的机器间自由的共享
5. 支持数据库大小至2TB
6. 足够小, 大致3万行C代码, 250K
7. 比一些流行的数据库在大部分普通数据库操作要快
8. 简单, 轻松的API
9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定
10. 良好注释的源代码, 并且有着90%以上的测试覆盖率
11. 独立: 没有额外依赖
12. Source完全的Open, 你可以用于任何用途, 包括出售它
13. 支持多种开发语言,C, PHP, Perl, Java, ASP .NET,Python
下面我以一个完整的Demo例子来展示对SQLite数据库操作,包括对数据库表的增、删、改、查等基本操作。下面的一个截图是该演示Demo的项目框架图:
通过上面的截图可以看到该项目src目录下包含两个类:MainActivity.java 和 MySQLiteOpenHelper.java 。其中MySQLiteOpenHelper.java是对数据库操作辅助类。
布局文件main.xml的代码:
[c-sharp] view
plaincopy
<?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">
<TextView android:id="@+id/tv_title"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="Hello, Welcome to Andy's blog!" android:textSize="16sp"/>
<Button android:id="@+id/newTable" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="1.新建数据表"/>
<Button android:id="@+id/addOne" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="2.插入一条记录"/>
<Button android:id="@+id/query" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="3.查询数据库"/>
<Button android:id="@+id/editOne" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="4.修改一条记录"/>
<Button android:id="@+id/deleteOne" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="5.删除一条记录"/>
<Button android:id="@+id/deleteTable" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="6.删除数据表"/>
<TextView android:id="@+id/tv_result"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="测试显示的结果" android:textSize="16sp"/>
</LinearLayout>
MainActivity.java代码:
[c-sharp] view
plaincopy
package com.andyidea.sqlite;
import java.io.File;
import java.io.IOException;
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.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btn_newTable,btn_addOne,btn_query,
btn_editOne,btn_deleteOne,btn_deleteTable;
private TextView tv;
private MySQLiteOpenHelper myOpenHelper;
private SQLiteDatabase sqlitedb;
//----以下两个成员变量是针对在SD卡中存储数据库文件使用----
//private File path = new File("/sdcard/dbfile"); //数据库文件目录
//private File f = new File("/sdcard/dbfile/AndyDemo.db"); //数据库文件
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initializeViews();
//实例化默认数据库辅助操作对象
myOpenHelper = new MySQLiteOpenHelper(this);
//----如要在SD卡中创建数据库文件,先做如下的判断和创建相对应的目录和文件----
//if(!path.exists()){ //判断目录是否存在
// path.mkdirs(); //创建目录
//}
//if(!f.exists()){ //判断文件是否存在
// try{
// f.createNewFile(); //创建文件
// }catch(IOException e){
// e.printStackTrace();
// }
//}
}
/**
* 初始化UI界面
*/
private void initializeViews(){
tv = (TextView)findViewById(R.id.tv_result);
btn_newTable = (Button)findViewById(R.id.newTable);
btn_addOne = (Button)findViewById(R.id.addOne);
btn_query = (Button)findViewById(R.id.query);
btn_editOne = (Button)findViewById(R.id.editOne);
btn_deleteOne = (Button)findViewById(R.id.deleteOne);
btn_deleteTable = (Button)findViewById(R.id.deleteTable);
btn_newTable.setOnClickListener(new ClickEvent());
btn_addOne.setOnClickListener(new ClickEvent());
btn_query.setOnClickListener(new ClickEvent());
btn_editOne.setOnClickListener(new ClickEvent());
btn_deleteOne.setOnClickListener(new ClickEvent());
btn_deleteTable.setOnClickListener(new ClickEvent());
}
class ClickEvent implements OnClickListener{
@Override
public void onClick(View v) {
try{
//[1]--如果是在默认的路径下创建数据库,那么实例化sqlitedb的操作如下
sqlitedb = myOpenHelper.getWritableDatabase(); //实例化数据库
//[2]--如果是在SD卡中创建数据库,那么实例化sqlitedb的操作如下
//sqlitedb = SQLiteDatabase.openOrCreateDatabase(f, null);
if(v == btn_newTable){ //1.新建数据表
String TABLE_NAME = "andy";
String ID = "id";
String TEXT = "text";
String str_sql2 = "CREATE TABLE " + TABLE_NAME + "(" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT
+ " text );";
sqlitedb.execSQL(str_sql2);
tv.setText("新建数据表成功!");
}else if(v == btn_addOne){ //2.插入一条记录
//----第1种插入数据的方法----
//ContentValues是一个哈希表HashMap,key值是对应数据表中字段名称,
//value值是字段的值。可以通过ContentValues的put方法把数据存放到
//ContentValues对象中,然后把数据插入到相对应的数据表中。
ContentValues cv = new ContentValues();
cv.put(MySQLiteOpenHelper.TEXT, "新数据");
sqlitedb.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
//db.insert(String table, String nullColumnHack, ContentValues values);方法解说
//public long insert (String table, String nullColumnHack, ContentValues values)
//该方法是向数据表中插入一条记录
//[1]参数table:需要插入操作的表名
//[2]参数nullColumnHack:默认null即可,若在插入一行数据时,若没有指定某列的值,
// 则默认使用null值传入。
//[3]参数values:插入的数据
//----第2种插入数据的方法----
// String INSERT_DATA =
// "INSERT INTO andy (id,text) values (1, '第2种插入数据的方法')";
// sqlitedb.execSQL(INSERT_DATA);
tv.setText("添加新数据成功!");
}else if(v == btn_query){ //3.查询数据库
Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+MySQLiteOpenHelper.TABLE_NAME, null);
if(cur != null){
String temp = "";
int i = 0;
while(cur.moveToNext()){
temp += cur.getString(0); //0代表数据列的第一列,即id
temp += cur.getString(1); //1代表数据列的第二列,即text
i++;
temp += "/n"; //定义显示数据的格式,一行一个数据
}
tv.setText(temp);
}
}else if(v == btn_editOne){ //4.修改一条记录
//----第1种方式修改数据----
ContentValues cv = new ContentValues();
cv.put(MySQLiteOpenHelper.TEXT, "更新后的数据");
sqlitedb.update("andy", cv, "id " + "=" + Integer.toString(1), null);
//[1]参数table:需要操作的表名
//[2]参数values:ContentValues
//[3]参数whereClause:更新的条件
//[4]参数whereArgs:更新条件对应的值
//----第2种方式修改数据----
// String UPDATA_DATA =
// "UPDATE andy SET text='通过SQL语句来修改数据' WHERE id=1";
// sqlitedb.execSQL(UPDATA_DATA);
tv.setText("修改数据成功!");
}else if(v == btn_deleteOne){ //5.删除一条记录
//----第1种方式删除数据----
sqlitedb.delete("andy", MySQLiteOpenHelper.ID + "= 1", null);
//public int delete(String table, String whereClause, String[] whereArgs)解说
//[1]参数table:需要操作的表名
//[2]参数whereClause:删除的条件
//[3]参数whereArgs:删除条件对应的值
//----第2种方式删除数据----
//String DELETE_DATA = "DELETE FROM andy WHERE id=1";
//sqlitedb.execSQL(DELETE_DATA);
tv.setText("删除数据成功!");
}else if(v == btn_deleteTable){ //6.删除数据表
sqlitedb.execSQL("DROP TABLE andy");
tv.setText("删除数据表成功!");
}
}catch(Exception e){
tv.setText("操作失败");
}finally{
sqlitedb.close();
}
}
}
}
MySQLiteOpenHelper辅助器类代码:
[c-sharp] view
plaincopy
package com.andyidea.sqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* 此类继承了SQLiteOpenHelper抽象类,是一个辅助器类,需要
* 一个构造函数和重写两个方法。
* @author Andy
*/
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "AndyDemo.db"; //数据库名
public static final int VERSION = 1; //版本号
public static final String TABLE_NAME = "andy"; //表名
public static final String ID = "id";
public static final String TEXT = "text";
public MySQLiteOpenHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
/**
* 在数据库第一次生成的时候会调用这个方法,同时我们在这个方法里边生成数据库表
*/
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据表的操作
String strSQL = "CREATE TABLE " + TABLE_NAME + "(" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );";
db.execSQL(strSQL);
}
/**
* 更新或者升级数据库的时候会自动调用这个方法,一般我们会在这个方法中
* 删除数据表,然后再创建新的数据表操作。
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("AndyDemo", "onUpgrade");
}
}
当我们需要把数据库创建在SDCard中时,需要在AndroidManifest.xml文件中添加对SDCard操作的权限,如下:
[c-sharp] view
plaincopy
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
通过以上步骤的操作,对SQLite数据库的操作有了大概的认识。下面我们来看看程序运行的效果。
相关文章推荐
- Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库
- Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库
- Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库
- Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库
- Android学习笔记(5&&6) ————采用SQLite存储数据及在SDCard中创建数据库
- Android的数据存储(Preference、SQLite、SDCard、File、ContentProvider)【未完,待编辑】
- Android数据存储之Sqlite采用SQLCipher数据库加密实战
- android创建数据库(SQLite)保存图片示例ZZ 分类: Android数据存储 2015-03-22 09:58 41人阅读 评论(0) 收藏
- Android——SdCard数据存储
- Android存储数据到sdcard
- Android——数据库sqlite存储数据
- Android数据存储(2)向机身内存(Internal Storage)和SDcard(External Storage)读写数据实例
- [Android 数据存储] SDcard/Android/data/ 这个目录是干什么的?
- Android 数据存储之 SQLite嵌入式数据库
- android 数据存储技术(1/4)androidSQLite数据库存储
- Android SQLite数据库存储之添加数据
- Android 存储数据之 SQLite 数据库
- android 在SdCard上创建数据库
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 【Android】数据存储数据库SQLite(之前有看到的一篇关于SQLite文章,简单明了、覆盖较全面适合学习)