项目开发中有时需要用到一些写死的数据,如公司的产品信息之类的。这就需要我们先把数据库文件保存在资源文件夹下,然后当应用创建时将数据库文件拷到应用安装目录的/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();
之后就能进行各种操作了。