如何使用 GreenDao ORM 库从 Android 中的资产创建数据库

Posted

技术标签:

【中文标题】如何使用 GreenDao ORM 库从 Android 中的资产创建数据库【英文标题】:How to create database from Assets in Android using GreenDao ORM library 【发布时间】:2012-03-26 16:21:17 【问题描述】:

我正在使用GreenDao orm 库来创建数据库,它适用于从代码中创建数据库的第一个示例。

现在的问题是我找不到任何文档或任何与数据库从资产文件夹复制到内存中的数据库相关的内容。

【问题讨论】:

www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ 阅读本文 我知道从SqliteOpenHelper class 创建数据库的基本方法,只是我需要使用这个名为GreenDaoORM 工具,以及它如何使用它的库做同样的事情 @SomeoneSomewhere 嘿,您有没有使用 GreenDAO 处理 SQLite 数据库的任何示例或方法。请告诉我们.. 【参考方案1】:

接受的答案提供了一个解决方案,但它只是部分正确。查看我在下面发布的课程。这是 greenDao 的 OpenHelper 类的扩展。下面是它的使用示例,以及如何使用它而不是 OpenHelper 或 DevOpenHelper 来管理 sqlite 数据库的副本。

package com.example;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import com.example.R;
import com.example.DaoMaster.OpenHelper;

public class DatabaseOpenHelper extends OpenHelper 

    private Context context;

    private SQLiteDatabase sqliteDatabase;

    private static String DB_PATH;

    private static String DB_NAME;

    public DatabaseOpenHelper(Context context, String name, CursorFactory factory) 
        super(context, name, factory);
        this.context = context;
        this.DB_NAME = name;
        this.DB_PATH = context.getString(R.string.DB_PATH);
        try 
            createDataBase();
         catch (Exception ioe) 
            throw new Error("Unable to create database");
        
    

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
        // TODO Auto-generated method stub

    

    /** Open Database for Use */
    public void openDatabase() 
        String databasePath = DB_PATH + DB_NAME;
        sqliteDatabase = SQLiteDatabase.openDatabase(databasePath, null,
                (SQLiteDatabase.OPEN_READWRITE));
    

    /** Close Database after use */
    @Override
    public synchronized void close() 
        if ((sqliteDatabase != null) && sqliteDatabase.isOpen()) 
            sqliteDatabase.close();
        
        super.close();
    

    /** Get database instance for use */
    public SQLiteDatabase getSqliteDatabase() 
        return sqliteDatabase;
    

    /** Create new database if not present */
    public void createDataBase() 
        SQLiteDatabase sqliteDatabase = null;

        if (databaseExists()) 
            /* Check for Upgrade */
         else 
            /* Database does not exists create blank database */
            sqliteDatabase = this.getReadableDatabase();
            sqliteDatabase.close();

            copyDataBase();
        
    

    /** Check Database if it exists */
    private boolean databaseExists() 
        SQLiteDatabase sqliteDatabase = null;
        try 
            String databasePath = DB_PATH + DB_NAME;
            sqliteDatabase = SQLiteDatabase.openDatabase(databasePath, null,
                    SQLiteDatabase.OPEN_READONLY);
         catch (SQLiteException e) 
            e.printStackTrace();
        

        if (sqliteDatabase != null) 
            sqliteDatabase.close();
        
        return sqliteDatabase != null ? true : false;
    

    /**
     * Copy existing database file in system
     */
    public void copyDataBase() 

        int length;
        byte[] buffer = new byte[1024];
        String databasePath = DB_PATH + DB_NAME;

        try 
            InputStream databaseInputFile = this.context.getAssets().open(DB_NAME+".sqlite");
            OutputStream databaseOutputFile = new FileOutputStream(databasePath);

            while ((length = databaseInputFile.read(buffer)) > 0) 
                databaseOutputFile.write(buffer, 0, length);
                databaseOutputFile.flush();
            
            databaseInputFile.close();
            databaseOutputFile.close();

         catch (FileNotFoundException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        

    

下面是它的用法示例:

DatabaseOpenHelper helper = new DatabaseOpenHelper(this, "db", null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();

【讨论】:

萨拉姆。字符串资源“R.string.DB_PATH”的值是多少? 您可以使用此代码来支持 JB 4.2 多用户: if(android.os.Build.VERSION.SDK_INT >= 17) DB_PATH = context.getApplicationInfo().dataDir + "/databases /"; else DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; ***.com/a/9109728/1676736 非常巧妙的解决方案! @SayedAbolfazlFatemi 这对我有用:"/data/data/" +context.getPackageName()+"/databases/" 如果这样做,是否可以调用greendao函数如loadAll()或获取表的实例...?

以上是关于如何使用 GreenDao ORM 库从 Android 中的资产创建数据库的主要内容,如果未能解决你的问题,请参考以下文章

Android ORM 框架之 greenDAO应用基础

Android ORM 框架之 greenDAO应用基础

ORM 性能:greenDAO 比 ORMLite 快吗?

[转]Android ORM系列之GreenDao最佳实践

Android ORM——初识greenDAO 3及使用greenDAO 3前应该掌握的一些知识点

Android ORM——初识greenDAO 3及使用greenDAO 3前应该掌握的一些知识点