摘抄自书籍《第一行代码》第六章·数据存储和持久化技术(侵删)
1、持久化技术
将内存中的瞬时数据保存在存储设备中,使其不会丢失。持久化技术提供了一种机制可以让数据在瞬时状态和持久化状态之间切换2、文件存储
不对存储的内容进行任何的格式化处理,适合用于存储一些简单的文本数据或二进制数据1)将数据存储到文件中—-使用Java流(按Back不会丢失)
2)从文件中读取数据
项目:编辑框控件,输入编辑框中的数据会被保存在文件中;若按退出再进入,原编辑框中的数据会从文件中恢复到编辑框中
package codefirst.sqlite_test;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/***
* 数据存储----文件存储
*/
public class MainActivity extends AppCompatActivity {
private EditText save_et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
save_et= (EditText) findViewById(R.id.et_save);
String input_data=load();
if(!TextUtils.isEmpty(input_data)){ //空值和null都会判TRUE
save_et.setText(input_data);
save_et.setSelection(input_data.length());
Toast.makeText(getApplicationContext(),"保存成功",Toast.LENGTH_LONG).show();
}
}
/***
* 读入文件数据
*/
private String load() {
String line=""; //保存由流转化而来的数据
FileInputStream input=null;
BufferedReader reader=null; //读取流转化成 对象
StringBuilder content=new StringBuilder(); //读取保存的数据
try {
input=openFileInput("fileName"); //读入的文件名
reader=new BufferedReader(new InputStreamReader(input));
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
while ((line=reader.readLine())!=null){ //按行读取
content.append(line); //读取出来存放在StringBuilder对象中
}
if(reader!=null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return content.toString();
}
@Override
protected void onDestroy() {
super.onDestroy();
String input_text=save_et.getText().toString(); //在销毁是保存数据
save(input_text);
}
/***
* 保存到文件的方法
* 文件默认存储在/data/data/
/files/
*/
public void save(String text) {
String data=""+text;
FileOutputStream file=null;
BufferedWriter writer=null;
try {
file=openFileOutput("fileName",MODE_PRIVATE); //文件名,操作模式(若无则创建、同名则覆盖)
//返回的是一个FileOutputStream对象
writer=new BufferedWriter(new OutputStreamWriter(file)); //将流最终转化为BufferedWriter对象
writer.write(data); //利用方法将文本内容写入文件中
} catch (IOException e) {
e.printStackTrace();
} finally {
if(writer!=null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3、SharedPreferences存储
使用键值对存储数据;支持多种不同数据类型
1)将数据存储到SharedPreferences中
a.首先需要获取SharedPreferences对象,三种方法
<1>Context类中的getSharedPreferences()方法: 第一个参数--指定文件名称(存放在/shared_prefs) 第二个参数--操作模式 ①MODE_PRIVATE默认,0 ②MODE_MULTI_PROCESS只有当前的程序才可对此文件进行读写
<2>Activity类中的getPreferences()方法: 只接收当前活动类名作为SP的文件名
<3>PreferenceManager类中的getDefaultSharedPreferences()方法: 静态方法,接受一个Context参数,用包名作为...
b.得到对象则可向SP文件中存储数据,分三步: <1>调用SP对象的edit()方法获取一个SP.Editor对象 <2>向SP.Editor对象添加数据 eg.添加布尔型 putBoolean方法
<3>调用commit()方法将添加的数据提交,完成存储操作
2)从SP中读取数据==SP对象提供了对应put的get方法,接受两个参数,一个是键值,一个是默认值(无传入数据时)
SharedPreferences.Editor editor=getSharedPreferences("fileName",MODE_PRIVATE).edit();
//getSP获取对象 .edit()获取SP.Editor对象
editor.putString("name","Ed"); //添加数据
editor.putInt("age",23); //键keyName,值value
editor.commit(); //提交
SharedPreferences pref=getSharedPreferences("fileName",MODE_PRIVATE); //对象
String name=pref.getString("name",""); //获取数据
int age=pref.getInt("age",0);
Log.d("tag",""+name+" "+age);
package codefirst.sqlite_test;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
/***
* SharedPerferences数据存储
*/
public class SharedPreferencesActivity extends AppCompatActivity {
private Button login_btn;
private CheckBox remember_cb;
private EditText account_et;
private EditText password_et;
private SharedPreferences.Editor account_Editor;
private SharedPreferences pref;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.share_prefer_layout);
init();
pref= PreferenceManager.getDefaultSharedPreferences(this);
boolean isRemember=pref.getBoolean("remember_password",false); //将用户选中的状态数据
if(isRemember){ //获取已经保存的数据
String account=pref.getString("account",""); //用pref取出数据
String password=pref.getString("password","");
account_et.setText(account);
password_et.setText(password);
remember_cb.setChecked(true);
Log.d("tag3", account + " " + password);
}
login_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String account = account_et.getText().toString(); //根据输入的编辑框中的数据
String password = password_et.getText().toString();
boolean remember_pas=remember_cb.isChecked(); //是否记住密码
if (account.equals("ed") && password.equals("23")) {
account_Editor = pref.edit(); //创建对象 用editor存数据
if(remember_pas){ //如果记住密码,则存储数据
account_Editor.putString("account", account); //将保存在变量中的数据存储到SP中
account_Editor.putString("password", password);
account_Editor.putBoolean("remember_password",remember_pas); //包括记住密码的状态数据
}else {
account_Editor.clear(); //清除数据
}
account_Editor.commit();
Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_LONG).show();
Intent Sql_intent = new Intent(getApplicationContext(), SQLiteActivity.class);
startActivity(Sql_intent);
finish();
} else {
Toast.makeText(getApplicationContext(), "账号或密码错误", Toast.LENGTH_LONG).show();
}
}
});
}
//初始化控件
private void init() {
login_btn = (Button) findViewById(R.id.btn_login);
remember_cb = (CheckBox) findViewById(R.id.cb_remember);
account_et = (EditText) findViewById(R.id.et_account);
password_et = (EditText) findViewById(R.id.et_password);
}
}
4、SQLite数据库存储
创建数据库辅助类
package codefirst.sqlite_test;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/***
* 创建数据库的辅助类
*/
public class MyDatabaseHelper extends SQLiteOpenHelper {
//创建数据库的书写标准
public static final String CREATE_BOOK="create table book( " +
"id integar primary key,"+"author text,"+"price real)";
public static final String CREATE_CATEGORY="create table category(" +
"id integar primary key ,age integar ,pages integar)";
//不能有自动增长autoincrement,报错,原因不详
private Context mContext; //上下文,在不能用方法时可在其他方法中使用
/***
* 构造方法
* @param context
* @param name 数据库名称
* @param factory 查询数据时返回一个自定义的Cursor,一般为null
* @param version 版本号
*/
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext=context;
}
//数据库创建
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK); //执行建表语句
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext,"创建表成功",Toast.LENGTH_LONG).show();
}
/***
* @param db 数据库类
* @param oldVersion 旧版本数据库号
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion , int newVersion) {
db.execSQL("drop table if exists BOOK");
db.execSQL("drop table if exists CATEGORY"); //升级,要先将已有的表删掉,因为数据库已经存在,不会再次执行哦你create方法
onCreate(db); //执行创建方法
}
}
主类(Activity),实现创建数据库、添加数据、删除、更新、查询
package codefirst.sqlite_test;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
/**
* Created by cheng on 2017/1/16.
*/
public class SQLiteActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
private Button create_db_btn; //创建
private Button add_btn;
private Button updata_btn;
private Button delete_btn;
private Button query_btn;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sql_layout);
//版本号改变
dbHelper=new MyDatabaseHelper(getApplicationContext(),"BookStore.db",null,2); //创建实例,使用构造方法
init();
initClick();
}
//监听事件
private void initClick() {
create_db_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHelper.getWritableDatabase(); //调用实例方法,即可创建DB
Toast.makeText(getApplicationContext(),"创建成功",Toast.LENGTH_LONG).show();
}
});
//添加数据
add_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db=dbHelper.getWritableDatabase(); //获取SQLiteDatabase对象
ContentValues values=new ContentValues(); //使用CV对数据组装
values.put("author","cheng");
values.put("price","23.3");
db.insert("book",null,values); //插入第一条数据
values.clear(); //清空
values.put("id",03);
values.put("author","white");
values.put("price","14.3");
db.insert("category",null,values); //插入
values.clear(); //清空
values.put("id",06);
values.put("author","cheng_cate");
values.put("price","33.33");
db.insert("category",null,values); //插入
Toast.makeText(getApplicationContext(),"添加成功",Toast.LENGTH_LONG).show();
}
});
updata_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("author","black"); //需要更新的数据
db.update("book",values,"author=?",new String[]{"cheng"});
//约束更新的列名 提供第三个参数的候选项
Toast.makeText(getApplicationContext(),"更新成功",Toast.LENGTH_LONG).show();
}
});
delete_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
db.delete("categoty","price>?",new String[]{"40"});
Toast.makeText(getApplicationContext(),"删除成功",Toast.LENGTH_LONG).show();
}
});
//返回一个Cursor对象----查询
query_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
Cursor cursor=db.query("category",null,null,null,null,null,null); //查询的约束条件
if(cursor.moveToFirst()){ //控制指针
do{
String author=cursor.getString(cursor.getColumnIndex("author"));
int price=cursor.getInt(cursor.getColumnIndex("price"));
int id=cursor.getInt(cursor.getColumnIndex("id"));
Log.d("tag","author"+author+" price"+price+" id"+id);
}while (cursor.moveToNext()); //游标移动
}
cursor.close(); //关闭
Toast.makeText(getApplicationContext(),"查询成功",Toast.LENGTH_LONG).show();
}
});
}
private void init() {
create_db_btn= (Button) findViewById(R.id.btn_create);
add_btn= (Button) findViewById(R.id.btn_add);
updata_btn= (Button) findViewById(R.id.btn_update);
delete_btn= (Button) findViewById(R.id.btn_delete);
query_btn= (Button) findViewById(R.id.btn_query);
}
}