android - 如何从 Realm 中读取数据

标签 android realm

我使用 Realm 开发我的登录应用程序。 我在“Config myConfig = mRealm.createObject(Config.class)”行中将我的 token 写在 Realm 中。之后从 Realm 读取没有结果,同样 Realm 没有条目。 我确实 checkin 了我标记为“//check - 为什么这里没有用户”的这段代码。 并且 User.size() 等于零。

public class MainActivity extends AppCompatActivity {

    private Realm mRealm;
    private Realm mRealmInstance;

    Button btnLogin;

    public void onLogin() {

        AsyncHttpClient client = new AsyncHttpClient();

        RequestParams rp = new RequestParams();
        rp.add("email", "name@example.com");
        rp.add("password", "159753");

        RequestHandle post = client.post("https://example.com/api/v1/auth", rp, new JsonHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                // Root JSON in response is an dictionary i.e { "data : [ ... ] }
                // Handle resulting parsed JSON response here
                try {
                    String tokenString = response.getString("token");

                    mRealm.beginTransaction();
                    Config myConfig = mRealm.createObject(Config.class);
                    myConfig.name = "token";
                    myConfig.tokenValue = tokenString;
                    mRealm.commitTransaction();
                } catch (NullPointerException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String res, Throwable t) {
                // called when response HTTP status is "4XX" (eg. 401, 403, 404)
            }
        });

        //check - why no users here
        TextView tvHello = (TextView)findViewById(R.id.tvHello);
        try {
            RealmResults User = mRealmInstance.where(Config.class).equalTo("name", "token").findAllAsync();
            if (User.size() > 0) {

                String nameOfUser = User.get(0).toString();
                tvHello.setText(nameOfUser);

            } else if (User.size() == 0) {
                Log.e("query","query size is "+User.size());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //end of test block
    }

最佳答案

在访问您的数据之前,您正在进行异步网络调用。网络调用尚未完成,因此您的数据为空。将您的数据访问代码放在 onSuccess() 回调中。

public class MainActivity extends AppCompatActivity {

...

public void onLogin() {

    ...

    RequestHandle post = client.post(
        "https://example.com/api/v1/auth", 
        rp, 
        new JsonHttpResponseHandler() {

        @Override
        public void onSuccess(
            int statusCode, 
            Header[] headers, 
            JSONObject response) {
            try {
                String tokenString = response.getString("token");

                mRealm.beginTransaction();
                Config myConfig = mRealm.createObject(Config.class);
                myConfig.name = "token";
                myConfig.tokenValue = tokenString;
                mRealm.commitTransaction();

                populateData();
            } catch (NullPointerException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(
            int statusCode,
            Header[] headers, 
            String res, 
            Throwable t) {
            // called when response HTTP status is "4XX" (eg. 401, 403, 404)
        }
    });
}

private void populateData() {
    TextView tvHello = (TextView)findViewById(R.id.tvHello);
    try {
        RealmResults User = 
            mRealmInstance.where(Config.class).equalTo("name", "token").findAll();
        if (User.size() > 0) {

            String nameOfUser = User.get(0).toString();
            tvHello.setText(nameOfUser);

        } else if (User.size() == 0) {
            Log.e("query","query size is "+User.size());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

另请注意,您应该使用 findAll() 而不是 findAllAsync()。阅读文档以获取有关差异的更多信息:https://realm.io/blog/realm-java-0-84-0/

关于android - 如何从 Realm 中读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48201986/

相关文章:

android - 滚动完成时的事件

android - 如何在 Chrome OS 上启用 ADB 调试?

android - Realm 会自动下载所有同步的 Realms 吗?

Xamarin 与 Fody.WeavingTask 和 SolutionDir 相关的问题

android - Gradle 扩展 assembleRelease

java - 如何修复不同语言中出现的 setError 消息?

android - Activity 管理器崩溃

Android Realm 迁移版本号基于什么?

swift - 无法使用 Realm 存档 Swift OSX 应用程序

ios - 如何在 iOS 项目中正确配置 Realm DB 文件 (<db_name>.realm) 的路径?