【问题标题】:Realm - offline use领域 - 离线使用
【发布时间】:2018-10-18 12:14:44
【问题描述】:

我正在创建一个应用程序,它从特定来源下载数据并将它们存储在 Realm 数据库中。根据我的理解,我应该每次都能访问那个数据库,之后我需要那个数据。

所以我尝试了以下过程:初始化数据库。下载数据并获取该数据的数据库。在终端上打印数据。 -> 就目前而言,一切都很顺利。

所以现在根据我的理解,我关闭了应用程序并重新启动它。现在我试图打印出数据,但没有任何反应。这是否意味着数据库仅在我的应用程序处于活动状态的期间处于活动状态?

有没有办法在安卓设备上存储 Realm 数据库以供离线使用?这意味着,如果我的用户无法访问互联网并需要使用下载的数据库。

我的代码:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        final MainActivity act = this;
        initRealm();
        setRights();

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Button for updating database
        Button btn = findViewById(R.id.getData);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //Connects to database
                ConnectToDatabase c = new ConnectToDatabase(act);
                c.doInBackground();
                values = c.getValues();

                Realm realm = Realm.getDefaultInstance();
                realm.beginTransaction();
                int i = 0;
                for (List<Object> rows : values) {
                    entry e = realm.createObject(entry.class, String.valueOf((++i) + 1));
                    //e.setEntry();
                    e.setNachname((String) rows.get(1));
                }
                realm.commitTransaction();
                realm.close();
                //showResults();
            }
        });
        Button btn2 = findViewById(R.id.qr_scanner);
        btn2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v){
                    showResults();
                }
        });
}



    //Show current Realm results
    public void showResults(){
        Realm realm = Realm.getDefaultInstance();
        RealmQuery<entry> query = realm.where(entry.class);
        RealmResults<entry> listEntries = query.findAll();
        for (entry x : listEntries){
            System.out.println(x.getId());
        }
        realm.close();
    }

    //Initialisation for Realm
    private void initRealm() {
        Realm.init(this);
        String root = Environment.getExternalStorageDirectory().getAbsolutePath();
        RealmConfiguration realmConfig = new RealmConfiguration.Builder()
                .name("management.database")
                .directory(new File(this.getFilesDir().getAbsolutePath() + "/realm/"))
                .build();
        Realm.deleteRealm(realmConfig);
        Realm.setDefaultConfiguration(realmConfig);
    }


    private void setRights() {
        StrictMode.ThreadPolicy policy = new
                StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

【问题讨论】:

  • 你应该删除setRights();它只是隐藏错误

标签: android realm realm-mobile-platform realm-list


【解决方案1】:

在您的 initRealm() 方法中,包含以下命令:

Realm.deleteRealm(realmConfig);

简而言之,每次初始化时都会删除领域。这就是为什么你没有得到任何结果。你不需要互联网连接来访问你的领域。它存储在本地。你应该避免删除它。

【讨论】:

  • 谢谢!我觉得好傻我误解了这个功能。我想,这只会删除 defaultConfiguration 并用我的替换它。
  • 不用担心。很高兴我能帮上忙。享受编码!
  • 我可以再问一个问题吗?如果我想再次下载数据并获取具有更新值的数据库会发生什么?这个数据库会有双重条目吗?通常数据库没有重复的条目。
  • 我应该删除数据库并用新数据库替换它还是只是添加新对象?
  • 假设你以 json 格式获取数据,有一个奇妙的领域方法,如果没有,将创建一个新的“表”,或者更新现有的:createOrUpdateAllFromJson(YourTable.class,YourJSON)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多