第 6 章 数据存储

来源:互联网 发布:淘宝衣服缩水 编辑:程序博客网 时间:2024/06/03 13:51

一、文件存储
不对存储内容进行任何格式化处理,原封不动存储到文件中,适合于存储简单文本数据或二进制数据。
1、存储5部曲:

  1. 获取FileOutputStream对象,该对象通过Context类提供的openFileOutput()方法获取
  2. 获取OutputStreamWriter对象,传入参数为上面获取的FileOutputStream对象
  3. 获取BufferedWriter对象,该对象传入参数为上面获取的OutputStreamWriter对象
  4. 用BufferedWriter对象的write()方法将数据写入
  5. 关闭BufferedWriter对象
   public void save(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 {            try {                if (writer != null) {                    writer.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }

2、读取5部曲

  1. 获取FileInputStream对象
  2. 获取InputStreamReader对象,需要传入上面获取的FileInputStream对象
  3. 获取BufferedReader对象,需要传入上面的InputStreamReader对象;
  4. 用readLine()读取
  5. 关闭BufferedReader对象
 public String load() {        FileInputStream in = null;        BufferedReader reader = null;        StringBuilder content = new StringBuilder();        try {            in = openFileInput("data");            reader = new BufferedReader(new InputStreamReader(in));            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();    }

二、SharedPreferences存储
SharedPreferences采用键值对方式存储数据
1、存储4部曲

  1. 获取SharedPreferences对象 三种方法
    1.1 Context类中getSharedPreferences()方法,两个参数,名称和操作模式
    1.2 Activity类中getPreferences()方法:一个参数,操作模式
    1.3 PreferenceManager类中getDefaultSharedPreferences()方法:一个参数context参数
  2. 调用SharedPreferences对象的edit()方法获取SharedPreferences.Editor对象
  3. 向SharedPreferences.Editor对象中添加数据,putString()、putBoolean()等
  4. 调用commit()写入数据

2、读取2部曲

  1. 获取SharedPreferences对象
  2. 利用getString()、getInt()等获取数据。传入两个参数,一是key,二是默认值,即如果找不到该key,则返回该默认值。
        saveData.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {//   1 文件名为  data.xml//          SharedPreferences pref = getSharedPreferences("data", Context.MODE_PRIVATE);//   2  文件名为 MainActivity.xml//          SharedPreferences pref =  getPreferences(Context.MODE_PRIVATE);//    3文件名为 包名.xml                SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);                SharedPreferences.Editor editor = pref.edit();                editor.putString("name", "Tom");                editor.putInt("age", 28);                editor.putBoolean("married", false);                editor.apply();                String name = pref.getString("name", "");                int age = pref.getInt("age", 0);                boolean married = pref.getBoolean("married", false);                Log.d("MainActivity", "name is " + name);                Log.d("MainActivity", "age is " + age);                Log.d("MainActivity", "married is " + married);            }        });

三、SQLite数据库
1、创建数据库
首先,建立自己的public class MyDatabaseHelper extents SQLiteOpenHelper{}
SQLiteOpenHelper类为抽象类,需要重写两个抽象方法:onCreate()和onUpdate()
还要重写构造方法。参数最少的构造方法有四个参数:Context、database_name、Cursor(一般写null、vision版本号)。
然后,建立MyDatabaseHelper的对象,调用其getReadableDatabase()或 getWritableDatabase()方法。

public class MyDatabaseHelper extends SQLiteOpenHelper{    public static final String     CREATE_BOOK="create table Book(id integer primary key autoincrement,author text,price real,pages integer,name text)";    private Context mcontext;    public MyDatabaseHelper(Context context, String name,            CursorFactory factory, int version) {        super(context, name, factory, version);        mcontext=context;    }    public void onCreate(SQLiteDatabase db) {        db.execSQL(CREATE_BOOK);    }    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

在MainActivity中调用,

databaseHelper = new MyDatabaseHelper(this, "BookStore", null, 1);databaseHelper.getWritableDatabase();

此时,创建了一个名为BookStore,版本为1的数据库。并且,调用了onCreate()方法,建立了一个名为Book的表。

2、升级数据库
Tips
(1)当相同版本的数据库BookStore已经存在了,则MyDatabaseHelper中的onCreate()方法就不会执行了。
(2)如果创建表时发现该表已经存在,则会直接报错,所以需要将已经存在的表删除。
(3)只有当版本号比原来高,onUpdate()方法才会执行。

databaseHelper = new MyDatabaseHelper(this, "BookStore", null, 2);

添加一张表进去,并提高数据库版本

public void onCreate(SQLiteDatabase db) {        db.execSQL(CREATE_BOOK);        db.execSQL(CREATE_CATEGORY);        Toast.makeText(mcontext, "创建成功", Toast.LENGTH_SHORT).show();    }    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        db.execSQL("drop table if exists Book");        db.execSQL("drop table if exists Category");        onCreate(db);    }

缺点:需要删除已经存在的表,以前的数据也会被删除。
3、添加数据
4、更新数据
5、删除数据
6、查询数据
7、直接使用SQL操作数据库
四、数据库最佳实践
1、使用事务
首先,开启事务:db.beginTransaction();
然后,执行数据库操作;
最后,事务成功:db.setTransactionSuccessful();
2、升级数据库最佳写法
之前升级数据库时,为了确保新增加的table之前没有,就先把table全部删除了,这样的行为是很不合常理的。
改进方法为:
改变version,然后在onUpdate()中进行判断,根据version执行不同的更新操作。

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {switch (oldVersion) {case 1:db.execSQL(CREATE_CATEGORY);case 2:db.execSQL("alter table Book add column category_id integer");default:}}
版本 数据库的改动情况 version=1 建数据库,添加table Book $1600 version=2 添加table Category version=3 在table Book中添加category_id

如果是第一次安装,则直接进入onCreate(),直接安装最新版本;
如果第一次安装版本1,则进入onUpdate(),连续进行了两次升级;
如果第一次安装版本2,则进入onUpdate(),只进行了最后一次升级。

0 0
原创粉丝点击