zoukankan      html  css  js  c++  java
  • Android 使用greenDAO 3.2.2 操作外部数据库

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

    之后就能进行各种操作了。

  • 相关阅读:
    2019年第二周作业
    2019年pta作业第二题——求最大值及其下标
    2019春第十一周作业
    2019春第十周作业
    2019年寒假作业3
    2019年寒假作业2
    2019年寒假作业1
    我的老师
    自说
    Day16
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/9294085.html
Copyright © 2011-2022 走看看