使用情况
所谓外部数据库文件此处指的就是一个在外部单独创建的db文件,假设有这么一个场景,我们项目中有一些本地数据,
不需要接口去获取的(不需要进行网络操作),写死的数据,比如全国各个省各个市的一些基本信息,
每个市的信息可以作为表里的一条记录存放,在项目中使用,
此时如何我们已经有了包含这些信息的db文件,
我们就可以通过greendao来操作这个db文件,更具方便进行开发工作
1.将数据库放到Android Studio中
在Java 文件目录下创建assets文件
将xxx.db文件复制到该文件目录下
2.将assets目录下数据库文件拷贝到 greenDAO默认保存数据库的地址也是在应用安装目录的/databases/文件夹下。
//数据库文件路径
private static final String DB_PATH = "/data/data/包名/databases/";
//数据库文件名
private static final String DB_NAME = "数据库.db";
/**
* assets目录下的db转移到databases
*
* @param context 上下文对象
* @param assetsName assets目录下db的文件名
* @param isNeedCover 是否需要覆盖
*/
public static void copyDBToDatabases(Context context, String assetsName, Boolean isNeedCover) {
// 获取内部存储目录
String path = context.getFilesDir().getParent();
try {
// 组装生成db的目录(不存在则创建目录)
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);
// 文件不存在创建 或 文件存在且覆盖也创建
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.数据库表的创建
/**
*
* 因为导入的是已经创建好表的数据库,
* 所以要在类前注解:@Entity(nameInDb = "productinfo",createInDb = false),
* 其中nameInDb = "tablename"是声明表名,不作此声明greenDAO默认操作的是库名的同名的表;
* 另一句createInDb = false是声明不再创建这个表,
* 如果不这样声明greenDAO就会在UserDao文件中加入createTable方法,
* 继而创建一个名叫tablename的同名表,然后就会出现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.使用数据库
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "数据库.db");
Database db = helper.getWritableDb();
DaoSession daoSession = new DaoMaster(db).newSession();
网友评论