Sqlite
使用
- 创建数据库
- 创建表
Android为了让我们能方便的管理数据库,提供了一个SQLiteOpenHelper
帮助类,借助这个类就可以非常简单地对数据库进行创建和升级,所以我们需要先继承 SQLiteOpenHelper
写一个 DatabaseHelper
,代码如下:
public class DatabaseHelper extends SQLiteOpenHelper{
/**
* 先把建表语句用字符串变量存起(也可以不存,直接在函数里写,但这样规范些)
*/
public static final String CREATE_BOOK = "create table Book (" +
"id integer primary key autoincrement," +
"author text," +
"price real," +
"pages integer," +
"name text)";
public static final String CREATE_CATEGORY = "create table Category(" +
"id integer primary key autoincrement," +
"category_name text," +
"category_code integer)";
private Context mContext;
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.mContext = context;
Log.d(LogUtil.TAG,"DatabaseHelper");
}
/**
* 第一次创建数据库时执行,如果数据库已经存在,则不在执行
* @param sqLiteDatabase
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
sqLiteDatabase.execSQL(CREATE_CATEGORY);
Log.d(LogUtil.TAG,"onCreate");
Toast.makeText(mContext,"Created succeded",Toast.LENGTH_SHORT).show();
}
/**
* 此方法升级数据库时会被回调
* @param sqLiteDatabase
* @param i
* @param i1
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.d(LogUtil.TAG,"onUpgrade");
sqLiteDatabase.execSQL("drop table if exists Book");
sqLiteDatabase.execSQL("drop table if exists Category");
onCreate(sqLiteDatabase);
}
/**
* 每次打开数据库时都会执行,也就是
* DbHelper.getWritableDatabase() 或 mDbHelper.getReadableDatabase()
* @param db
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.d(LogUtil.TAG,"onOpen");
}
}
上面的注释写的比较详细,把每个方法都写到了,相信应该能看懂。
然后需要调用创建DatabaseHelper
的实例,然后通过DatabaseHelper
来获得SQLiteDatabase
实例,我们就可以使用返回的SQLiteDatabase
实例来操作数据库了
//参数一:Context
//参数二:数据库名称
//参数三:允许我们在查询数据时返回一个自定义的Cursor,一般用不到,传入null
//参数四:版本号
DatabaseHelper mDbHelper = new DatabaseHelper(this,"BookStore.db",null,2);
//一般是getWritableDatabase()
mDb = mDbHelper.getWritableDatabase() 或 mDbHelper.getReadableDatabase()
- 升级数据库
//修改版本号就行
DatabaseHelper mDbHelper = new DatabaseHelper(this,"BookStore.db",null,3); // 下次升级就把 3 改成更大的
- 增加数据(insert)
//用contentValues来保存你需要存储的数据
ContentValues contentValues = new ContentValues();
contentValues.put("pages",pages);
contentValues.put("price",price);
//参数一:表名
//参数二:用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般用不到,设为null
//参数三:ContentValues对象
mDb.insert("Book",null,contentValues);
//清空contentValues
contentValues.clear();
- 查询数据(select)
SQLiteDatabase
中提供了一个query()
方法用于对数据进行查询,这个方法参数比较复杂,最短的一个也需要传7个参数,界面来介绍一个7个参数的含义:
- table :指定查询的表名
- columns :指定查询的列名
- selection :指定where的约束条件
- selectionArgs :为where重的占位符提供具体的值
- groupBy :指定需要group by的列
- having :对group by后的结果进一步约束
- orderBy :指定查询结果的排列方式
以下是查询数据的代码片段:
mSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mDb == null){
mDb = mDbHelper.getWritableDatabase(); //创建或打开数据库
}
name = mEdit_Name.getText().toString();
Cursor cursor = mDb.query("Book",null,"name = ?",new String[]{name},null,null,null);
if (cursor.moveToFirst()){
do {
name = cursor.getString(cursor.getColumnIndex("name"));
author = cursor.getString(cursor.getColumnIndex("author"));
pages = cursor.getString(cursor.getColumnIndex("pages"));
price = cursor.getString(cursor.getColumnIndex("price"));
mTv_Name.setText(name);
mTv_Author.setText(author);
mTv_Pages.setText(pages);
mTv_Price.setText(price);
}while (cursor.moveToNext());
}
}
});
- 更新数据(update)
update()
函数有4个参数,和query()
的大部分相同
- table:指定查询的表名
- values:刷新的值
- whereClause:指定where的约束条件
- whereArgs:为where重的占位符提供具体的值
以下是更新数据的代码片段:
mUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mDb == null){
mDb = mDbHelper.getWritableDatabase(); //创建或打开数据库
}
name = mEdit_Name.getText().toString();
author = mEdit_Author.getText().toString();
pages = mEdit_Pages.getText().toString();
price = mEdit_Price.getText().toString();
if (!"".equals(author))contentValues.put("author",author);
if (!"".equals(pages))contentValues.put("pages",pages);
if (!"".equals(price))contentValues.put("price",price);
mDb.update("Book",contentValues,"name = ?",new String[]{name});
contentValues.clear();
}
});
- 删除数据(delete)
delete()
方法有3个参数,和上面的一样,就不细说了,代码如下:
mDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mDb == null){
mDb = mDbHelper.getWritableDatabase(); //创建或打开数据库
}
name = mEdit_Name.getText().toString();
mDb.delete("Book","name = ?",new String[]{name});
}
});
问题:
- getReadableDatabase() 和 getWritableDatabase() 的区别?
- 两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象
- 当数据库不可写入时(比如磁盘满了),getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。
File
适用场景
文件存储是Android中最基本的一种数据存储方式,它不对
存储的内容进行任何的格式化处理
,所有的数据都是原封不动
的保存到文件中,所以它适合存储一些简单的文本数据或二进制数据
。
使用
保存数据
openFileOutput()
方法可以指定两种模式:
MODE_PRIVATE
:是默认的操作模式,表示当指定同样文件名的时候,所写的内容将会覆盖原文件中的内容。
MODE_APPEND
:表示如果该文件已存在,就往里面追加内容。
private void sava(String inputText){
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
读取数据
private String load(){
FileInputStream input = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
input = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(input));
String line = "";
while ((line = reader.readLine()) != null){
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
Sharedpreference
不同于文件存储,Sharedpreference是使用键值对的方式来存储数据的,Sharedpreference还支持多种不同的数据类型存储,存的是String取出也是String,存进去的是整形,读取出来也是整形。
使用
获取Sharedpreference对象
Android中提供了 3 种方法用于得到SharedPreferences对象
-
Context类
中的getSharedPreferences()
方法
此方法接收两个参数:
第一个参数用于指定Sharedpreference的名称,如果指定的文件不存在则会创建一个
第二个用于指定操作模式,目前只有
MODE_PRIVATE
这一模式可选,是默认的模式,和直接传入0
的效果一样,表示只有当前的应用程序才可以对这个Sharedpreference文件进行读写
Activity类
中的getPreferences()
方法
和方法1
类似,不过只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为Sharedpreference
的文件名PreferenceManager 类
中的
getDefaultSharePreferences()
方法
使用步骤
保存数据:
(1)、获取Sharedpreference对象
(2)、调用Sharedpreference对象的 edit()
方法来获取一个 Sharedpreference.Editor对象
。
(3)、向Sharedpreference.Editor对象中添加数据
,比如putBoolean()
、putString()
方法等等
(4)、调用apply()
方法将添加的数据提交
,从而完成数据存储操作
示例代码:
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name",mEdit_Name.getText().toString());
editor.putString("age",mEdit_Age.getText().toString());
editor.apply();
取出数据:
(1)、获取Sharedpreference对象
(2)、调用Sharedpreference对象的 getString()
等方法获取数据
示例代码:
SharedPreferences preferences = getSharedPreferences("data",MODE_PRIVATE);
mTv_Name.setText(preferences.getString("name",""));
mTv_Age.setText(preferences.getString("age",""));