gpt4 book ai didi

具有现有数据库和自定义文件路径的 Android Sugar ORM

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:06:47 26 4
gpt4 key购买 nike

我完全能够通过提供的示例使用 Sugar ORM。

在我的用例中,我从服务器下载了一个 SQLite 数据库(它的 ETL 负载以数百万条记录为单位,因此必须在服务器端完成)。下载保存到内部存储的自定义路径。

在我的例子中,我不需要基于 POCO 的动态数据库创建。

如果所有 POCO 类字段与表结构匹配,是否可以将 Sugar ORM 与预先存在的 SQLite 数据库一起使用,指向自定义路径?

最佳答案

  1. 首先,我对 Sugar 扩展的想法不太满意应用程序类。如果我有其他任务需要执行怎么办在应用程序启动之前?!所以让我们用我们自己的扩展 SugarAppAppClass 然后在 manifest 中注册 appClass 名称。另外,我相信这是第一次初始化数据库的正确位置。

    public class MyAppStartClass extends SugarApp {

    @Override
    public final void onCreate() {
    init();
    super.onCreate();
    }

    private void init() {
    initDB();
    }

    private void initDB() {
    try {
    if (!doesDatabaseExist(this, consts.dbPath)) {
    Context context = getApplicationContext();
    SQLiteDatabase db = context.openOrCreateDatabase(consts.dbName, context.MODE_PRIVATE, null);
    db.close();
    InputStream dbInput = getApplicationContext().getAssets().open(consts.dbName);
    String outFileName = consts.dbPath;
    OutputStream dbOutput = new FileOutputStream(outFileName);
    try {
    byte[] buffer = new byte[1024];
    int length;
    while ((length = dbInput.read(buffer)) > 0) {
    dbOutput.write(buffer, 0, length);
    }
    } finally {
    dbOutput.flush();
    dbOutput.close();
    dbInput.close();
    }
    }
    } catch (Exception e) {
    e.toString();
    }
    }

    private boolean doesDatabaseExist(ContextWrapper context, String dbName) {
    File dbFile = context.getDatabasePath(dbName);
    return dbFile.exists();
    }
    }
  2. list :android:name="com.myPackageName.MyAppStartClass"

  3. 确保先创建一个空数据库,否则 FileOutputStream() 和 dbPath =/data/data/com.myPackageName/databases/myDb.db 会出错

    SQLiteDatabase db = context.openOrCreateDatabase(consts.dbName, context.MODE_PRIVATE, null);

    db.close();

  4. 确保您现有的数据库架构具有主键列 ID。哦耶! Sugar 仅将 ID 视为检索数据的主键。

  5. 如果您想使用现有表,请在扩展 SugarRecord 时不要指定 T,并且您必须将 Sugar 添加为模块,并且您的项目依赖于它!

    public class Book extends SugarRecord {
    String title;
    String edition;

    public Book(){
    }

    public Book(String title, String edition){
    this.title = title;
    this.edition = edition;
    }
    }

6.如果要使用现有的表。请注意,Sugar 会查找大写的列名,因此如果您现有的表列名是小写的,您将永远无法从中获取任何现有数据!

7. 这使我得出一个不太情愿的结论:如果您从头开始创建数据库并使用它为您生成数据库和表,那么 Sugar 非常棒。但当您已经拥有一个包含数据的现有数据库时,情况就不一样了。

关于具有现有数据库和自定义文件路径的 Android Sugar ORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24225541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com