1. 程式人生 > >提高android資料庫效能,GreenDao初步使用

提高android資料庫效能,GreenDao初步使用

前言

基本上android開發都會用到資料庫,資料庫的出現就是為了快取資料,但是一但我們的資料很多很多的時候呢?哪該怎麼處理呢,所以最近我在網上了解了下一些有關android資料庫的框架,發現有那麼幾款資料庫框架的。我初步對比了一下,發現GrennDao還是非常不錯的。

優點:

  • 強大的API,豐富的功能

  • 記憶體消耗小

  • 高效能

缺點:

  • 前奏比較長(搭建)
    但我相信這個應該不會難倒我們這些熱愛新技術的小青年的

開工

這裡用的IDE是android studio,還在用eclipse的小夥伴趕快換上吧!首先在我們java同等級目錄下新建一個資料夾 java-gen
![這裡寫圖片描述](https://img-blog.csdn.net/20160118094923004)  
然後在我們gradle裡面配置一下

  buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
sourceSets{
    main{
        java.srcDirs = ['src/main/java','src/main/java-gen']
    }
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'de.greenrobot:greendao:2.0.0' //配置GreenDao

}

在我們project裡面新建一個library,gradle裡面配置下:
dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
compile ‘de.greenrobot:greendao-generator:2.0.0’
}
然後新建一個java類,都有詳細註釋

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

public class GreenDaoGenerator {
public static void main(String [] args) throws  Exception{
    //建立一個用於新增實體的Schema物件,第一個引數表示資料庫的版本,第二個引數表示在java-gen目錄下自動生成的實體類和DAO類存放的包名
    Schema schema=new Schema(1,"greendao");
    //schema.setDefaultJavaPackageDao("com.smile.dao");//假如你不想實體類和DAO類都放在一個包中,你可以重新為DAO類設定一個新的包
    Entity entity=schema.addEntity("User");//建立一個實體,一個實體對應一張表,此處表示生成的實體名為Student,同樣它預設也是表名
    entity.addIdProperty().autoincrement().primaryKey();
    entity.addStringProperty("name");
    entity.addIntProperty("age");
    entity.addBooleanProperty("is_man");
    //最後通過DaoGenerator物件的generateAll()方法來生成相應的實體類和DAO類,引數分別為Schema物件和java-gen目錄路徑
    new DaoGenerator().generateAll(schema,"../GreenDAO/app/src/main/java-gen");

    }
}

然後執行我們的這個java類,它會在開始我們建的java-gen裡面生成幾個java類
這裡寫圖片描述

以上都是我們的配置工作,既然配置工作都做好了,那麼對資料庫的操作就非常簡單了。
這是佈局圖,很簡單的,程式碼我就不貼了。
這裡寫圖片描述

最後就是我們編寫activity了,我這裡沒有對輸入的內容進行處理,一旦輸入的內容不合法很容易出現崩潰,僅僅只是測試用。

public class MainActivity extends AppCompatActivity {
private DaoSession session;
private DaoMaster.DevOpenHelper helper;
private UserDao userDao;
private DaoMaster master;

private EditText meditText;
private ListView mlistView;
private SimpleCursorAdapter adapter;
private SQLiteDatabase db;
private Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    meditText= (EditText) findViewById(R.id.edt_content);
    mlistView= (ListView) findViewById(R.id.listview);

    helper=new DaoMaster.DevOpenHelper(MainActivity.this,"user-db",null);
    db=helper.getWritableDatabase();
    master=new DaoMaster(db);
    session=master.newSession();
    //得到StudentDAO物件,所以在這看來,對於這三個DAO檔案,我們更能接觸到的是StudentDao檔案,進行CRUD操作也是通過StudentDao物件來操作
    userDao=session.getUserDao();
    //遍歷查詢資料
    cursor=db.query(userDao.getTablename(),userDao.getAllColumns(),null,null,null,null,null);
    String [] from={UserDao.Properties.Name.columnName,UserDao.Properties.Age.columnName};
    int[] to = {android.R.id.text1, android.R.id.text2};
    adapter=new SimpleCursorAdapter(this,android.R.layout.simple_list_item_1,cursor,from,to, SimpleAdapter.NO_SELECTION);
    mlistView.setAdapter(adapter);

}
public void click(View v){
    switch (v.getId()){
        case R.id.btn_add:
        add();
        Cursor cursor=db.query(userDao.getTablename(),userDao.getAllColumns(),null,null,null,null,null);
        adapter.swapCursor(cursor);//交換cursor資料集重新整理UI
        break;
        case R.id.btn_update:
            update();
            Cursor cursor1=db.query(userDao.getTablename(),userDao.getAllColumns(),null,null,null,null,null);
            adapter.swapCursor(cursor1);//交換cursor資料集重新整理UI
            break;
        case R.id.btn_delete:
            delete();
            Cursor cursor2=db.query(userDao.getTablename(),userDao.getAllColumns(),null,null,null,null,null);
            adapter.swapCursor(cursor2);//交換cursor資料集重新整理UI
            break;
        case R.id.btn_search:
            search();
            break;

    }
}
private void add(){
    String content=meditText.getText().toString().trim();
    User user=new User(null,content,20,true);//由於主鍵id之前設定了自增長,所以傳入null即可
    userDao.insert(user);

}
private void delete(){
    String content=meditText.getText().toString().trim();
    userDao.deleteByKey(Long.valueOf(content));//通過主鍵刪除某條資料
    //刪除全部資料
    //userDao.deleteAll();

}
private void update(){
    String content=meditText.getText().toString().trim();
    String update_content="新內容++++++";
    //update只能通過主鍵來更新某個實體對應的資料,這裡的主鍵為id
    userDao.update(new User(Long.valueOf(content),update_content,22,false));

}
private void search(){
    String content=meditText.getText().toString().trim();
    //通過queryBuilder()來查詢可以更方便的設定查詢的條件,其中eq()方法表示equal(),判斷Name是否和content相等,然後通過build建立查詢
    Query<User> query=userDao.queryBuilder().where(UserDao.Properties.Name.eq(content)).build();
    List<User> list=query.list();
    //下面兩個Flag的設定可以在控制檯中打印出此次查詢的sql語句和value值
    QueryBuilder.LOG_SQL = true;
    QueryBuilder.LOG_VALUES = true;
    new AlertDialog.Builder(this).setMessage(list.get(0).getName()+","+list.get(0).getAge()).setPositiveButton("確定",null).create().show();
}
}

差不多最基本的增刪改查操作都在這裡了,更加豐富的功能慢慢研究。