使用情況
所謂外部數(shù)據(jù)庫文件此處指的就是一個在外部單獨創(chuàng)建的db文件哼勇,假設(shè)有這么一個場景,我們項目中有一些本地數(shù)據(jù)呕乎,
不需要接口去獲取的(不需要進(jìn)行網(wǎng)絡(luò)操作)积担,寫死的數(shù)據(jù),比如全國各個省各個市的一些基本信息猬仁,
每個市的信息可以作為表里的一條記錄存放帝璧,在項目中使用,
此時如何我們已經(jīng)有了包含這些信息的db文件湿刽,
我們就可以通過greendao來操作這個db文件的烁,更具方便進(jìn)行開發(fā)工作
1.將數(shù)據(jù)庫放到Android Studio中
在Java 文件目錄下創(chuàng)建assets文件
將xxx.db文件復(fù)制到該文件目錄下
2.將assets目錄下數(shù)據(jù)庫文件拷貝到 greenDAO默認(rèn)保存數(shù)據(jù)庫的地址也是在應(yīng)用安裝目錄的/databases/文件夾下。
//數(shù)據(jù)庫文件路徑
private static final String DB_PATH = "/data/data/包名/databases/";
//數(shù)據(jù)庫文件名
private static final String DB_NAME = "數(shù)據(jù)庫.db";
/**
* assets目錄下的db轉(zhuǎn)移到databases
*
* @param context 上下文對象
* @param assetsName assets目錄下db的文件名
* @param isNeedCover 是否需要覆蓋
*/
public static void copyDBToDatabases(Context context, String assetsName, Boolean isNeedCover) {
// 獲取內(nèi)部存儲目錄
String path = context.getFilesDir().getParent();
try {
// 組裝生成db的目錄(不存在則創(chuàng)建目錄)
String dbFolder = path + File.separator + "databases" + File.separator;
File file = new File(dbFolder);
if (!file.exists()) {
file.mkdirs();
}
// 組裝db路徑
String outFileName = dbFolder + assetsName;
File dataFile = new File(outFileName);
// 文件不存在創(chuàng)建 或 文件存在且覆蓋也創(chuàng)建
if (!dataFile.exists() || (dataFile.exists() && isNeedCover)) {
if (dataFile.exists()) {
dataFile.delete();
}
InputStream myInput = context.getAssets().open(assetsName);
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) != -1) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
} catch (IOException e) {
Log.i("DbUtils", "error--->" + e.toString());
e.printStackTrace();
}
}
4.數(shù)據(jù)庫表的創(chuàng)建
/**
*
* 因為導(dǎo)入的是已經(jīng)創(chuàng)建好表的數(shù)據(jù)庫诈闺,
* 所以要在類前注解:@Entity(nameInDb = "productinfo",createInDb = false),
* 其中nameInDb = "tablename"是聲明表名渴庆,不作此聲明greenDAO默認(rèn)操作的是庫名的同名的表;
* 另一句createInDb = false是聲明不再創(chuàng)建這個表,
* 如果不這樣聲明greenDAO就會在UserDao文件中加入createTable方法,
* 繼而創(chuàng)建一個名叫tablename的同名表襟雷,然后就會出現(xiàn)table already exists的錯誤刃滓。
*/
@Entity(nameInDb = "Zdftyzdrxdxl",createInDb = false)
public class InspecBean {
@Property(nameInDb = "id")
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "Sid")
private String mac;
@Property(nameInDb = "Dict_xlname_zdft")
private String name;
@Property(nameInDb = "TotleXxNum")
private Integer num;
}
5.使用數(shù)據(jù)庫
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "數(shù)據(jù)庫.db");
Database db = helper.getWritableDb();
DaoSession daoSession = new DaoMaster(db).newSession();