目录
1. 数据库SQLite3。
2. 将数据存储到文件中。
3. SharedPreference 进行数据存储。
一、数据库SQLite3
1、数据库基础
1. 什么情况下使用数据库
存储大量数据结构相同的数据时使用数据库进行存储。
2. 创建数据库的步骤
(1) 创建一个类继承自SqliteOpenHelper。
添加一个构造方法、实现onCreate方法、onUpgrade方法。
(2) 创建一个数据库帮助类的实例对象,调用getWriteableDatabase()
帮助类对象中的getWritableDatabase 和 getReadableDatabase
都可以帮助我们获取一个数据库操作对象SqliteDatabase.
3. getWritableDatabase 和 getReadableDatabase的区别。
getReadableDatabase : 先尝试以读写方式打开数据库,如果磁盘空间满了,
他会重新尝试以只读方式打开数据库。
getWritableDatabase:直接以读写方式打开数据库,如果磁盘空间满了,就直接报错。
2、Android 下第一种数据库增删该查
逻辑
1. 创建一个帮助类对象,调用getReadableDatabase方法,返回一个SqliteDatabase对象。
2. 使用SqliteDataba对象的execSQL()方法做增、删、改;使用rawQuery()做查询。
3. 特点:增删改没有返回值不能判断是否执行成功。
代码
private MySqlOpenHelper mySqlOpenHelper;
public InfoDao(Context context) {
// 创建一个帮助类对象
mySqlOpenHelper = new MySqlOpenHelper(context);
}
public void add(InfoBean bean) {
// 执行SQL语句需要得到SQLiteDatabase对象。
SQLiteDatabase db = mySqlOpenHelper.getWritableDatabase();
// 执行SQL语句
db.execSQL("insert into info(name,phone) values(?,?);",new Object[]{bean.name,bean.phone});
// 关闭数据库对象。
db.close();
}
public void del(String name) {
// 获取数据库对象
SQLiteDatabase db = mySqlOpenHelper.getWritableDatabase();
// 执行SQL语句
db.execSQL("delete from info where name=?;",new Object[]{name});
// 关闭数据库对象。
db.close();
}
public void modi(InfoBean bean) {
// 获取数据库对象
SQLiteDatabase db = mySqlOpenHelper.getWritableDatabase();
// 执行SQL语句
db.execSQL("update info set name=?,phone=?;", new Object[]{bean.name,bean.phone});
// 关闭数据库
db.close();
}
public void que(String name) {
// 获取数据对象
SQLiteDatabase db = mySqlOpenHelper.getWritableDatabase();
// 执行SQL语句,并获取结果集合。
Cursor cursor = db.rawQuery("select _id,name,phone from info where name=?;", new String[]{name});
// 解析结果集合
if (cursor != null && cursor.getCount() > 0) {
// 循环遍历结果集,获取每一行的数据
while (cursor.moveToNext()) {
// 获取数据
int id = cursor.getInt(0);
String name1 = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println("_id :" + id + "name : " + name + " phone : " + phone);
}
// 关闭结果集
cursor.close();
}
// 关闭数据库
db.close();
}
3、Android 下第二种增删改查方式
private MySqliteOpenHelper mySqliteOpenHelper;
public InfoDao(Context context) {
mySqliteOpenHelper = new MySqliteOpenHelper(context);
}
public boolean add(InfoBean bean) {
// 获取数据库对象
SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
// 执行SQL语句
// table: 表名 ,
// nullColumnHack:可以为空,标示添加一个空行,
// values:数据一行的值 ,
// 返回值:代表添加这个新行的Id ,-1代表添加失败
ContentValues values = new ContentValues();
values.put("name", "WSJ");
values.put("phone", "123");
long res = db.insert("info", null, values);
// 关闭数据库
db.close();
if (-1 == res) {
return false;
}else {
return true;
}
}
public boolean del(String name) {
// 获取数据库对象。
SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
// 删除数据
// p1 : 表名,p2 : 条件 ,p3 : 参数
int res = db.delete("info", "name=?", new String[]{name});
// 关闭数据库连接
db.close();
if (0 == res) {
return false;
}else {
return true;
}
}
public boolean modi(InfoBean bean) {
// 获取数据库对象
SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
// 修改数据
ContentValues values = new ContentValues();
values.put("name", bean.name);
values.put("phone", bean.phone);
int res = db.update("info", values, "name=?", new String[]{bean.name});
// 关闭数据库连接
db.close();
if (0 == res) {
return false;
}else {
return true;
}
}
public void que(String name) {
// 获取数据库对象
SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
// 查询数据
Cursor cursor = db.query("info", new String[]{"_id","name","phone"}, "name=?", new String[]{name},null, null, null);
// 查看结果集
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name1 = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println("id : " + id + " name : " + name1 + " phone : " + phone);
}
cursor.close();
}
db.close();
}
注意:一般情况下用第一种方式中的查询操作,第二种方式中的增删改操作。
4、Android 下数据库事务的使用
public void transtation(View v){
//1.创建一个帮助类的对象
BankOpenHelper bankOpenHelper = new BankOpenHelper(this);
//2.调用数据库帮助类对象的getReadableDatabase创建数据库,初始化表数据,获取一个SqliteDatabase对象去做转账(sql语句)
SQLiteDatabase db = bankOpenHelper.getReadableDatabase();
//3.转账,将李四的钱减200,张三加200
db.beginTransaction();//开启一个数据库事务
try {
db.execSQL("update account set money= money-200 where name=?",new String[]{"李四"});
int i = 100/0;//模拟一个异常
db.execSQL("update account set money= money+200 where name=?",new String[]{"张三"});
db.setTransactionSuccessful();//标记事务中的sql语句全部成功执行
} finally {
db.endTransaction();//判断事务的标记是否成功,如果不成功,回滚错误之前执行的sql语句
}
}
二、文件存储
1、基础
1. 相关类
(1) Context的openFileOutput(param1,param2) :将数据存储到指定的文件。
参数一:文件名(不包含路径),默认存到"data/data/<package name>/files/"
参数二:操作模式;
MODE_PRIVATE : 默认操作模式,覆盖写。
MODE_APPEND : 追加写。
(2)Context的openFileInput(param1) : 从指定文件中读取数据。
参数一:文件名(不包含路径),系统会自动到"data/data/<package name>/files/"目录下寻找。
2. 技巧
(1) 通过openFileOutput/openFileInput 方法获取到FileOutputStream/FileInputStream对象
(2) 构建OutputStreamWriter/InputStreamReader.
(3) 构建FileWriter/FileReader.
(4) ... 进行操作。
2、代码
public void write(View view) {
System.out.println("写数据");
String txtString = inTextView.getText().toString();
FileOutputStream openFileOutput = null;
BufferedWriter bufferedWriter = null;
try {
// 获取 FileOutputStream
openFileOutput = mContext.openFileOutput("WSJ.txt", MODE_APPEND);
// 封装成BufferedWriter
bufferedWriter = new BufferedWriter(new OutputStreamWriter(openFileOutput));
// 写数据
bufferedWriter.write(txtString);
bufferedWriter.flush();
}catch(IOException e){
e.printStackTrace();
}finally{
if (bufferedWriter != null) {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void read(View view) {
System.out.println("读数据");
String txtString = "";
FileInputStream openFileInput = null;
BufferedReader reader = null;
try {
// 获取FileInputStream
openFileInput = mContext.openFileInput("WSJ.txt");
// 构建BufferedReader
reader = new BufferedReader(new InputStreamReader(openFileInput));
// 读取数据
StringBuilder stringBuilder = new StringBuilder();
while ((txtString = reader.readLine()) != null) {
stringBuilder.append(txtString);
}
if (stringBuilder.length() > 0) {
txtString = stringBuilder.toString();
}
outTextView.setText(txtString);
} catch (IOException e) {
e.printStackTrace();
}finally{
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
三、SharedPreference数据存储
1、基础
1. 获取SharedPreference对象有三中方式。
(1) Context 类中的getSharedPreference(param1,param2) 方法。
参数一:文件名(不包含路径),自动保存到“/data/data/<package name>/shared_prefs/”路径下
参数二:操作模式;
MODE_PRIVATE :是默认操作模式只在只有本应用可以使用。
MODE_MULTI_PROCESS:多个应用程序使用同一个文件。
(2) Activtity 类中的getPreference(param1)方法。
参数一:操作模式,同上。
注意 :会自动将当前活动的类名当做文件名。
(3) PreferenceManager 类的getDefaultSharedPreference(Context) 方法。
自动将当前程序的包名作为文件名前缀。
2. SharedPreference 保存数据步骤:
(1) 获取SharedPreference对象。
(2) 通过SharedPreference的edit() 方法获取到SharedPreference.Editor 对象。
(3) 调用Editor的 putXXX() 方法保存数据。
(4) 调用Editor的commit() 方法提交数据。
3. SharedPreference 读取数据步骤:
(1) 获取 SharedPreference对象。
(2) 调用getXXX() 方法获取数据。
2、代码
public void save() {
System.out.println("保存数据");
// 获取SharePreference对象
SharedPreferences shp = PreferenceManager.getDefaultSharedPreferences(this);
// 获取SharedPreference.Editor对象
Editor edit = shp.edit();
// 添加数据。
edit.putString("name", "WSJ");
edit.putInt("age", 18);
// 提交添加
edit.commit();
}
public void read() {
System.out.println("读取数据");
// 获取SharedPreference对象。
SharedPreferences shh = PreferenceManager.getDefaultSharedPreferences(this);
// 获取数据
String name = shh.getString("name", "");
int age = shh.getInt("age", 0);
System.out.println("name : " + name + " age : " + age);
}