Android 数据存储读取 持久化问题

阅读《第一行代码》笔记

一. 文本操作

使用context. openFileOutput输出数据到文本,使用context.openFileInput读取文本。

FileOutputStream out = null; 
BufferedWriter writer = null; 
try { 
    // data 是文本的名称,会在/data/data/包名/file/ 下新建data文件
    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(); 
    } 
}
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(); 
    } 
} 

//content就是最后读取的数据

二.SharedPreferences

SharedPreferences是使用键值对的方式来存储数据的。

SharedPreferences 文件都是存放在/data/data//shared_prefs/目录下

Context.getSharedPreferences()
Activity类的 getPreferences()
PreferenceManager类中的 getDefaultSharedPreferences()方法 

向sharedPreferences中存入数据

SharedPreferences.Editor editor=getSharedPreferences("data", MODE_PRIVATE).edit(); editor.putString("name", "Tom"); 
editor.putInt("age", 28); 
editor.putBoolean("married", false); 
editor.commit();

从sharedPreferences中读取数据

SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE);
String name = pref.getString("name", ""); 
int age = pref.getInt("age", 0); 
boolean married = pref.getBoolean("married", false); 

三. SQLite数据库读取

数据库文件会存放在/data/data//databases/目录下

创建DatabaseHelper,google要求使用SQLiteOpenHelper来管理sqlite数据库,SQLiteOpenHelper是一个抽象类,有两个抽象方法,分别是 onCreate()和 onUpgrade()。 getReadableDatabase() 和 getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在 则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不 同的是,当数据库不可写入的时候(如磁盘空间已满)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; 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
        db.execSQL(CREATE_BOOK); 
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } 
} 

通过SQLiteOpenHelper可以获取到数据库的读写权限。

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

当一个应用新建了一个数据库后,数据库中也存在表时SQLiteOpenHelper将不会再去调用onCreate方法,如果已经新建了数据库,但是想删除数据库重新建一个的话,可以调用onUpgrade

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {     
    db.execSQL("drop table if exists Book"); //book是表名
    db.execSQL("drop table if exists Category"); //Category是表名
    onCreate(db); 
}
/*2是数据库版本号,如果第一次传入的是1,第二次传入2的话,相当于版本更新了,SQLiteOpenHelper就会执行onUpgrade
*/
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2); 
dbHelper.getWritableDatabase(); 

如果第一次创建了book表,第二次想创建Category表,则可以直接在onUpgrade中加入创建Category表的命令,如下:

public static final String CREATE_CATEGORY = "create table Category (" + "id integer primary key autoincrement, " + "category_name text, " + "category_code integer)";

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(CREATE_CATEGORY);
}


//执行以下代码
mySQLiteOpenHelper = new MySQLiteOpenHelper(this,"sqliteDemo.db",null,2); //版本号高于1
mySQLiteOpenHelper.getWritableDatabase();
    

结果如下:

Android 数据存储读取 持久化问题_第1张图片

补充:

如果想手动查看sqlite数据库的话,可以按如下步骤

1. root手机
2. 不进入adb shell
3. adb pull /data/data/程序包名/databases/数据库名称.db  电脑需要存放的路径
4. 使用可以查看db文件的软件直接打开,如SQLiteSpy

想查看手机中新建的数据库文件的话

1. adb shell
2. cd /data/data/程序包名/databases/
3. ls 查看

 

//使用sql语句操作sqlite数据库
db.execSQL("insertintoBook(name,author,pages,price)values(?,?,?,?)", new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" }); db.execSQL("insertintoBook(name,author,pages,price)values(?,?,?,?)", newString[] { "The Lost Symbol","Dan Brown", "510", "19.95" }); 
更新数据的方法如下: 
db.execSQL("updateBooksetprice=? wherename=?",new String[]{"10.99", "The Da Vinci Code" }); 删除数据的方法如下: 
db.execSQL("delete from Book where pages > ?", new String[] { "500" }); 
查询数据的方法如下: 
db.rawQuery("select * from Book", null); 

 

SQLite数据库事物处理,如果事物处理成功则db.setTransactionSuccessful(); ,如果事物处理失败,db.endTransaction();此时,事物之间的所有操作取消。

SQLiteDatabase db = dbHelper.getWritableDatabase(); 
db.beginTransaction(); 
// 开启事务 
try { 
    db.delete("Book", null, null); 
    if (true) { 
    //在这里手动抛出一个异常,让事务失败 
    throw new NullPointerException(); 
} 
ContentValues values = new ContentValues(); 
values.put("name", "Game of Thrones"); 
values.put("author", "George Martin"); 
values.put("pages", 720); 
values.put("price", 20.85); 
db.insert("Book", null, values); 
db.setTransactionSuccessful(); // 事务已经执行成功 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    db.endTransaction(); // 结束事务 
}

 

你可能感兴趣的:(安卓)