Android 中的數據操作方式:文件操作/SharedPreferences /SQLite

一、文件操作

1.將文件寫入SD卡

//獲取寫入的路徑及文件名稱
File file =new File(Environment.getExternalStorageDirectory(),name);

FileOutPutStream fos =new FileOutPutStream(file);
//寫入內容
 fos.write(content.getBytes());​                                   

但是,最好是檢測一下手機中內存卡是否可用。在MainActivity的onResume()方法中:
//檢測手機中的內存卡是否裝載
 boolean isMounted =Environment.getExternalStorageDirectory().equals(Environment.MEDIA_MOUNTED)?true:false; 
                                              
//根據SD卡是否裝載來確定按鈕是否可用                                                                    
saveSD.setEnabled(isMounted);​            


兩個注意事項:1.在文件寫入寫出操作時注意聲明異常或者直接try catch環繞

2.在寫入外存儲設備時需要獲得寫入外存儲設備的權限,在Manifest中聲明即可​

2.將文件寫入Rom

 總共兩步:

FileOutputStream fos =Context.openFileOutput(name,mode);

fos.write(content.getBytes());

三個注意:

1.不需要聲明權限

2.mode總共有四種,如果想設置成私有屬性,即爲Context.MODE_PRIVATE,同時此程序外的其他程序將不能訪問到數據

3.如果一個類繼承自Activity,Context等等屬於Context的類​,那麼openFileOutPut()前面可省略context。當然如果一個類沒有繼承屬於Context類,那麼如果想用這個方法需要構造函數傳進來Context

二​​.SharedPreferences操作

爲什麼要用SharedPreferences(接口),因爲它是數據的持久化操作數據可以被保存起來​,程序關閉後再打開數據仍然存在,否則我們用Map就可以實現了。與Map一樣,它採用的是鍵值對的存儲方式

四步:獲取​SharedPreferences 對象,返回Editor編輯器,放入數據,提交(類似於Transaction的過程)

​SharedPreferences sp =getSharedPreferences(name,mode);//指定文件名和mode

Editor editor = sp.edit(); //獲取編輯器

editor.putString("key","value"); //放入數據

editor.commit();​ //提交數據

sp.getString("key",""); // 獲取數據,第二個參數 //爲默認值,如果沒有默認值,則寫“”就可以了

              注意,放數據是Editor對象放入,取數據是SharedPreferences對象取出。

三、SQLite數據庫的操作

1.​用SQL語句進行創建數據庫以及增刪改查(包括查詢數量,查詢所有,分頁查詢)​


1.1創建數據庫


1.新建類(此處爲DBOpenHelper)繼承自SQLiteOpenHelper ,重寫構造方法(四個參數),重寫onCreate()和 onUpgrade()方法(一個用來創建數據庫,一個用來寫數據庫的升級邏輯)

​2.DBOpenHelper helper = new DBOpenHelper(context,name,null,version);

helper.getWriteabDatabase(); //至此數據庫創建成功

1.2 增、刪、改


邏輯都很簡單,獲得SQLiteDatabase對象,然後執行SQL語句,之後關閉SQL

//假設上面已經創建了一個Person表,裏面有三列,分別是id ,name ,balance​

public void insertDB(Person p){ //插入數據----->>增

​ SQLiteDatabase db = helper.getWriteableDatabase();

db.execSQL("INSERT INTO person(name,balance) VALUES(?,?)",new Object[]{p.getName(),p.getBalance()});

db.close();​

}​

public void deleteDB(int balance){ //刪除數據------>>刪

//根據資金的多少進行刪除操作

.... //獲得db,同上

​db.exec("DELETE FROM person WHERE balance<?",new Object[]{balance};
db.close();
}

1.3 查(查一個,查所有,查數據總數,查分頁)


 //根據id返回一個Person對象
    public Person qureyDb(int id){
        SQLiteDatabase db = helper.getReadableDatabase();

        //獲取Cursor對象
        Cursor c = db.rawQuery("SELECT name,balance FROM person WHERE id =?", new String[]{id + ""});
        Person p = null;
        if(c.moveToNext()) {
            //根據列名獲取列所在的索引,通過getString,getInt取值,進而得到一個Person對象
           p  = new Person(id,c.getString(c.getColumnIndex("name")), c.getInt(1));
        }
        c.close();
        db.close();
        return p;
    }

    //將所有的數據查詢出來,放在一個列表中
    public List<Person> queryAll(){
        SQLiteDatabase db = helper.getReadableDatabase();
        
        //沒有條件,後面的值寫null
        Cursor c = db.rawQuery("SELECT id,name,balance FROM person", null);
        Person p = null;
        List<Person> persons = new ArrayList<Person>();

        while(c.moveToNext()){
            p = new Person(c.getInt(0),c.getString(1),c.getInt(2));
            persons.add(p);
        }
        c.close();
        db.close();
        return persons;
    }

    //分頁查詢,查詢第幾頁,以及每頁有多少條數據
    public List<Person> queryPage(int num,int capacity){
        //獲取起始索引
        int start = (num-1)*capacity;

        int end = start +capacity;
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor c = db.rawQuery("SELECT id,name,balance FROM person LIMIT ?,?", new String[]{start+"",end+""});
        Person p = null;
        List<Person> persons = new ArrayList<Person>();
        while(c.moveToNext()){
            p = new Person(c.getInt(0),c.getString(1),c.getInt(2));
            persons.add(p);
        }
        c.close();
        db.close();
        return persons;
    }

    //查詢表中數據總條數
    public int QueryCount(){
        SQLiteDatabase db = helper.getReadableDatabase();
        
        
       Cursor c = db.rawQuery("SELECT COUNT(*) FROM person", null);

        c.moveToNext();
        int count = c.getInt(0);
        return count;

    }
2.另外一種增刪改查
   和上面完全用SQL語句不同,這裏是SQLiteDatabase對象直接執行insert(),delete(),update(),query(),需要注意的就是參數問題。注意對比與執行SQL語句的不同,就是將關鍵字(像COUNT WHERE SELECT省略),將我們自己寫的東西變成參數作爲各個方法中所對應的參數值。另,其中涉及ContentValues,它和Map類似,可以存儲鍵值對,放進數據。
下面是代碼:
  //插入操作
    public void dbInsert(Person p){
        SQLiteDatabase db = helper.getWritableDatabase();
        //db.execSQL("insert into person(name,balance) values(?,?)",new Object[]{p.getName(),p.getBalance()});
        //獲取ContentValues對象
        ContentValues values = new ContentValues();
        values.put("name",p.getName());
        values.put("balance",p.getBalance());
        
        //對比db.execSQL("insert into person(name,balance) values(?,?)",new Object[]{p.getName(),p.getBalance()});
        db.insert("person", null, values);//(Table name,null,ContentValues values)
        db.close();
    }
    
    //刪除操作
    public  void delete(int id){
        SQLiteDatabase db = helper.getWritableDatabase();
        //對比db.execSQL("delete from person where id =?",new Object[]{id});
        //注意括號裏的參數(Table name,Whereclause,String[] whereArgs)
        db.delete("person", "id=?", new String[]{id + ""});
        db.close();

    }
    //更改操作
    public void update(Person p){
        SQLiteDatabase db = helper.getWritableDatabase();
        //db.execSQL("update person SET name=?,balance=? Where id=?",new Object[]{p.getName(), p.getBalance(),p.getId()});
        ContentValues values = new ContentValues();
        values.put("name",p.getName());
        values.put("balance",p.getBalance());
        
        //根據括號裏的參數來寫
        db.update("person", values, "id=?", new String[]{p.getId() + ""});
        db.close();
    }
    public Person dbquery(int id){
        SQLiteDatabase db = helper.getReadableDatabase();
        Person p = null;
        //Cursor c = db.rawQuery("SELECT name,balance FROM person WHERE id =?", new String[]{id + ""});
       Cursor c =  db.query("person",new String[]{"name","balance"},"id=?",new String[]{id+""},null,null,null);
        if(c.moveToNext()){
            p= new Person(id,c.getString(c.getColumnIndex("name")),c.getInt(1));
        }
        c.close();
        db.close();
        return p;

    }
    public List<Person> dbQueryAll(){
        SQLiteDatabase db = helper.getReadableDatabase();
        List<Person> persons = new ArrayList<Person>();
        Person p = null;
        Cursor c = db.query("person",null,null,null,null,null,null,null);
        while(c.moveToNext()){
            p = new Person(c.getInt(0),c.getString(1),c.getInt(2));
            persons.add(p);
        }
        c.close();
        db.close();
        return persons;
    }
    
    //查詢總數據條數
    public int queryCount(){
        SQLiteDatabase db = helper.getReadableDatabase();
        
        //將COUNT(*)作爲一列
        Cursor c = db.query("person", new String[]{"COUNT(*)"}, null, null, null, null, null);
        c.moveToNext();
        int count = c.getInt(0);

        c.close();
        db.close();
        return count;
    }
    public List<Person> queryPage(int num,int capacity){
        SQLiteDatabase db = helper.getReadableDatabase();
        int start = (num-1)*capacity;
        int end = start +capacity;
       // db.execSQL("select id,name,balance from person limit ?,?",new String[]{start+"",end+""});
        
        //調用query的帶有limit的重載方法
       Cursor c = db.query("person",null,null,null,null,null,null,start+","+end);
        List<Person> persons = new ArrayList<Person>();
        Person p = null;
        while (c.moveToNext()){
            p = new Person(c.getInt(0),c.getString(1),c.getInt(2));
            persons.add(p);

        }
        c.close();
        db.close();
        return persons;
    }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章