项目开发中有时需要用到一些写死的数据,如公司的产品信息之类的。这就需要我们先把数据库文件保存在资源文件夹下,然后当应用创建时将数据库文件拷到应用安装目录的/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 copyDbFileContext context, String db_name) { InputStream in = null; FileOutputStream out = null; String path = "/data/data/" + context.getPackageName) + "/databases/"; File file = new Filepath + db_name); //创建文件夹 File filePath = new Filepath); if !filePath.exists)) filePath.mkdirs); if file.exists)) return; try { in = context.getAssets).opendb_name); // 从assets目录下复制 out = new FileOutputStreamfile); int length = -1; byte[] buf = new byte[1024]; while length = in.readbuf)) != -1) { out.writebuf, 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' }
创建一个实体类
* 注意: *
* 因为导入的是已经创建好表的数据库,所以要在类前注解:@EntitynameInDb = "productinfo",createInDb = false)
,其中nameInDb = "tablename"
是声明表名,不作此声明greenDAO默认操作的是库名的同名的表;另一句createInDb = false
是声明不再创建这个表,如果不这样声明greenDAO就会在UserDao文件中加入createTable方法,继而创建一个名叫tablename的同名表,然后就会出现table already exists的错误。
每个变量前的@PropertynameInDb = "_id")
注解是为了让变量名能够指向列名,如果表中的一列是Name,而实体类中的属性是name,则在greenDAO编译后会创建
public final static Property Ear = new Property2, String.class, "name", false, "NAME");
参数分别是(列号,数据类型,变量名,是否是主键,列名),这里的列名默认是变量名的大写形式,与表中的列名有了偏差,执行SQLite语句时就会出现no such columns的错误。
@EntitynameInDb = "tablename",createInDb = false) public class User{ @PropertynameInDb = "_id") @Id autoincrement = true) private long id; @PropertynameInDb = "Name") private int name; @PropertynameInDb = "Ear") private String ear; }
创建完后要Make Project一次。
操作数据表
一切准备就绪后就是操作数据表了,首先要获得数据表的操作对象
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelperthis, "dbname.db"); Database db = helper.getWritableDb); DaoSession daoSession = new DaoMasterdb).newSession); ProductDao dao = daoSession.getProductDao);
之后就能进行各种操作了。