項目開發中有時需要用到一些寫死的數據,如公司的產品信息之類的。這就需要我們先把數據庫文件保存在資源文件夾下,然後當應用創建時將數據庫文件拷到應用安裝目錄的/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
因爲涉及到公司的東西就不貼源碼了,有問題可以直接評論,互相交流。