每日一学之Android数据存储SQLite数据库
Posted 进击的Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一学之Android数据存储SQLite数据库相关的知识,希望对你有一定的参考价值。
图片来自于百度图片
android中的数据库
Android 提供了对 SQLite数据库的完全支持,应用中的任何类(不包括应用外部的类)均可按名称访问您所创建的任何数据库。
创建SQLite数据库的两种方式
在外部创建好,然后放入raw或者assets文件夹中
在SQLiteOpenHelper 的 onCreate()函数中创建数据库,onCreate()只会在发现没有数据库的时候执行,也就说只会执行一次。
在实际的项目开发中,一般不会在代码中创建数据库,有些临时表单除外。总是先创建好数据库和表单,放入raw文件中,在项目启动的时候,将数据库拷贝放入/data/data/your packageName/xx.db,供SQLiteOpenHelper 使用。
使用已存在数据库
在SQLiteOpenHelper 中创建数据库后,数据库的路径及文件会自动绑定到Helper上,因此已经避免了一些在开发中的坑。但是我们在实际的使用中都是先创建好数据库,并存放到raw中,所以在此我们说一说怎么读取raw下已经有的数据库文件。
读取raw下数据库文件
void initDataBase(){
String packageName = getPackageName();
Log.i(TAG , "项目包名:" + packageName);
File file = new File(getFilesDir().getParent()+"/databases/");
Log.i(TAG , file.getPath() + " 数据库文件是否存在:" + file.exists());
if(!file.exists()) {
file.mkdir();
}
//这里的数据库文件名称一定不要有后缀
File file2 = new File(file.getPath()+"/test");
if(!file2.exists()){ try {
file2.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
InputStream is = getResources().openRawResource(R.raw.test); try {
int i = 0;
OutputStream os = new FileOutputStream(file2);
while((i = is.read()) != -1){
os.write((byte)i);
}
os.flush();
os.close();
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
注意:在将数据库拷贝到/data/user/0/your packageName/databases/下的时候,数据库一定不要带后缀
错误例子:/data/user/0/your packageName/databases/test.db
正确示例:/data/user/0/your packageName/databases/test
/data/user/0 == 所谓的/data/data/
实现SQLiteOpenHelper
public class mysqlitehelper extends SQLiteOpenHelper {
String TAG ="mydatastydy";
private static final int DATABASE_VERSION = 2;
private static final String DICTIONARY_TABLE_NAME = "dictionary";
private static final String DATABASE_NAME = "test";
private static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
"loginName TEXT, " +
"UserName TEXT );";
public MySQLitehelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(TAG , "数据库的路径为"+db.getPath());
//如果未创建数据库,执行数据库创建语句
//db.execSQL(DICTIONARY_TABLE_CREATE);
}
//数据库更新后,触发此函数
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
注意:这里注意onCreate函数,此函数只有在指定路径下(/data/user/0/your packageName/databases/)无数据库,才执行,且只会执行一次。
实现SQLiteOpenHelper
MySQLitehelper mh = new MySQLitehelper(this);
Cursor cursor = mh.getReadableDatabase().rawQuery("select * from user" , null);
while (cursor.moveToNext()) {
Log.i(TAG , "原用户名称: "+cursor.getString(cursor.getColumnIndex("userName")));
}
SQLiteDatabase sd = mh.getWritableDatabase();
sd.execSQL("update user set userName = ? where loginName = ?" ,
new String[]{"test" , "18326525417"});
cursor = mh.getReadableDatabase().rawQuery("select * from user" , null);
while (cursor.moveToNext()) {
Log.i(TAG , "更新后用户名称: "+cursor.getString(cursor.getColumnIndex("userName")));
}
ContentValues values = new ContentValues();
values.put("loginName", "16585458747");
values.put("userName", "test2");
sd.insert("user" , null , values);
cursor = mh.getReadableDatabase().rawQuery("select * from user" , null);
while (cursor.moveToNext()) {
Log.i(TAG , "新增后用户名称: "+cursor.getString(cursor.getColumnIndex("userName")));
}
sd.execSQL("delete from user where loginName = ?" ,
new String[]{"16585458747"});
cursor = mh.getReadableDatabase().rawQuery("select * from user" , null);
while (cursor.moveToNext()) {
Log.i(TAG , "删除用户名称: "+cursor.getString(cursor.getColumnIndex("userName")));
}
cursor.close();
sd.close();
当然常用增、删、改、查函数在Android中都提供了多种方式,由个人的喜好决定,条条大路通罗马。
下期提要
下期开始我们将进入Android中的通知和广播功能,敬请期待!
可了解更多编程方面的知识,
让你看到每天一点点的进步。
谢谢点赞 + 分享!!!!!!
不积跬步,无以至千里;
不积小流,无以成江海。
以上是关于每日一学之Android数据存储SQLite数据库的主要内容,如果未能解决你的问题,请参考以下文章