使用greenDAO 3.2.2 操作外部數據庫

項目開發中有時需要用到一些寫死的數據,如公司的產品信息之類的。這就需要我們先把數據庫文件保存在資源文件夾下,然後當應用創建時將數據庫文件拷到應用安裝目錄的/databases/文件夾下,然後再對數據進行操作。
本篇文章參考了【Android】GreenDao操作外部DB數據庫文件—-寒小楓

使用greenDAO操作數據庫能夠省去自己去寫SQLite語句的繁瑣,提高效率。greenDAO默認保存數據庫的地址也是在應用安裝目錄的/databases/文件夾下。

拷貝文件

拷貝文件就是將數據庫文件拷到應用安裝目錄的/databases/文件夾下

    //數據庫文件路徑
    private static final String DB_PATH = "/data/data/包名/databases/";
    //數據庫文件名
    private static final String DB_NAME = "dbname.db";

    /**
     * 將assets文件夾下文件拷貝到/databases/下
     * @param context
     * @param db_name
     */
    public static void copyDbFile(Context context, String db_name) {
        InputStream in = null;
        FileOutputStream out = null;
        String path = "/data/data/" + context.getPackageName() + "/databases/";
        File file = new File(path + db_name);

        //創建文件夾
        File filePath = new File(path);
        if (!filePath.exists())
            filePath.mkdirs();

        if (file.exists())
            return;

        try {
            in = context.getAssets().open(db_name); // 從assets目錄下複製
            out = new FileOutputStream(file);
            int length = -1;
            byte[] buf = new byte[1024];
            while ((length = in.read(buf)) != -1) {
                out.write(buf, 0, length);
            }
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) in.close();
                if (out != null) out.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

導入greenDAO依賴庫

// project級builde.gradle文件中
buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}

// module級builde.gradle文件中
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin

dependencies {
    compile 'org.greenrobot:greendao:3.2.2' // add library
}

配置路徑

//module級builde.gradle文件中
greendao {
    schemaVersion 1
    daoPackage '包名.gen'
    targetGenDir 'src/main/java'
}

創建一個實體類

* 注意: *
* 因爲導入的是已經創建好表的數據庫,所以要在類前註解:@Entity(nameInDb = "productinfo",createInDb = false),其中nameInDb = "tablename"是聲明表名,不作此聲明greenDAO默認操作的是庫名的同名的表;另一句createInDb = false是聲明不再創建這個表,如果不這樣聲明greenDAO就會在UserDao文件中加入createTable方法,繼而創建一個名叫tablename的同名表,然後就會出現table already exists的錯誤。

  • 每個變量前的@Property(nameInDb = "_id")註解是爲了讓變量名能夠指向列名,如果表中的一列是Name,而實體類中的屬性是name,則在greenDAO編譯後會創建
public final static Property Ear = new Property(2, String.class, "name", false, "NAME");

參數分別是(列號,數據類型,變量名,是否是主鍵,列名),這裏的列名默認是變量名的大寫形式,與表中的列名有了偏差,執行SQLite語句時就會出現no such columns的錯誤。

@Entity(nameInDb = "tablename",createInDb = false)
public class User{
    @Property(nameInDb = "_id")
    @Id (autoincrement = true)
    private long id;
    @Property(nameInDb = "Name")
    private int name;
    @Property(nameInDb = "Ear")
    private String ear;
}

創建完後要Make Project一次。

操作數據表

一切準備就緒後就是操作數據表了,首先要獲得數據表的操作對象

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "dbname.db");
Database db = helper.getWritableDb();
DaoSession daoSession = new DaoMaster(db).newSession();
ProductDao dao = daoSession.getProductDao();

之後就能進行各種操作了。

END

因爲涉及到公司的東西就不貼源碼了,有問題可以直接評論,互相交流。

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