【问题标题】:Saving and retrieving data from realm database in android在android中从领域数据库中保存和检索数据
【发布时间】:2017-07-11 03:17:42
【问题描述】:

您好,我使用领域将数据保存到 relam 数据库,但它没有将数据保存到数据库

在我的应用类中

Realm.init(this);
        RealmConfiguration config = new RealmConfiguration.Builder().build();
        Realm.deleteRealm(config);
        Realm.setDefaultConfiguration(config);

在我的储蓄活动中

  public void SaveUserData(final UserData userData, Realm realm)
    {
        final String userdata = new Gson().toJson(userData);
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
//                realm.createObjectFromJson(com.mediquick.databaseModel.UserData.class, userdata);

                com.mediquick.databaseModel.UserData user = realm.createObject(com.mediquick.databaseModel.UserData.class);
                user.setLname(userData.getLname());
                user.setEmail(userData.getEmail());
                user.setToken(userData.getToken());
                user.setAddress(userData.getAddress());
                user.setMobile_no(userData.getMobile_no());
                user.setDob(userData.getDob());
                user.setName(userData.getName());
                user.setProfile_pic(userData.getProfile_pic());
                user.setUser_type(userData.getUser_type());
            }
        });

当我检索一个值时

public String getUserToken(Realm realm)
    {
        final com.mediquick.databaseModel.UserData user = realm.where(com.mediquick.databaseModel.UserData.class).findFirst();
        return  (user!=null)?user.getToken():null;
    } 

当我从数据库中检索令牌时它返回 null

任何想法..

【问题讨论】:

  • 我不知道你在什么时候调用getUserToken()的线程。
  • @EpicPandaForce 主线程
  • 在这种情况下,只有当userData.getToken() 为空时才有可能。
  • @EpicPandaForce 保存时我调试的值很好。可能是因为我缺少 realm.insertOrUpdate 它没有保存值,所有领域执行都需要吗?
  • 您使用了realm.createObject(),它会立即创建托管实例,而setToken() 将因此保留在数据库中,因此不一定。

标签: android database realm crud realm-mobile-platform


【解决方案1】:

在 onCreate 函数之前声明 Realm 对象:

Realm realmDB; 

现在在 onCreate 方法中写下这行:

Realm.init(this);
realmDB=Realm.getDefaultInstance(); 

关于保存按钮的点击方法:

  try{
         realmDB.beginTransaction();
         UserSchedule us = realmDB.createObject(UserSchedule.class);
         us.setId(userData.get_ID());
         us.setDate(userData.getDate()); 
         realmDB.commitTransaction();
     }
     catch (Exception ex){
           Log.d("RError",ex.toString());
       Toast.makeText(this, "Error in realm", Toast.LENGTH_SHORT).show();
     }

获取记录:

RealmResults<UserSchedule>userSchedules=realmDB.where(UserSchedule.class).findAll();
        for (UserSchedule userSchedule:userSchedules)
        {
           Toast.makeText(this,userSchedule.getId(), Toast.LENGTH_SHORT).show();
           Toast.makeText(this, userSchedule.getId(), Toast.LENGTH_SHORT).show(); 
        }

删除记录:

 RealmResults<UserSchedule> result = realmDB.where(UserSchedule.class).findAll();

UserSchedule userSchedule = result.where().equalTo("Id", getItem(position).getS_ID()).equalTo("Date",getItem(position).getDate()).findFirst();
if(userSchedule!=null)
{

if (!realmDB.isInTransaction()) 
{
    realmDB.beginTransaction();
}
 userSchedule.deleteFromRealm();
 realmDB.commitTransaction();
}
else
{
Toast.makeText(this,"No Record.", Toast.LENGTH_SHORT).show();
}

【讨论】:

    【解决方案2】:

    你能不能试试这个保存功能:

    // SAY YES TO THIS
    Realm realm = null;
    try {                          // I could use try-with-resources here
        realm = Realm.getDefaultInstance();
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                realm.insertOrUpdate(dog);
            }
        });
    } finally {
      if(realm != null) {
        realm.close();
      }
    }
    

    在您的代码中,您缺少调用

    realm.insertOrUpdate(user)
    

    executeTransaction 函数内部。

    【讨论】:

      【解决方案3】:
      public void saveData(){
          realm.executeTransactionAsync(new Realm.Transaction() {
              @Override
              public void execute(Realm bgRealm) {
                  Students students = bgRealm.createObject(Students.class);
                  students.setName(name.getText().toString().trim());
                  students.setCity(city.getText().toString().trim());
                  students.setDegree(degree.getText().toString().trim());
                  students.setGender(gender.getSelectedItem().toString().trim());
              }
          }, new Realm.Transaction.OnSuccess() {
              @Override
              public void onSuccess() {
                  // Transaction was a success.
              }
          }, new Realm.Transaction.OnError() {
              @Override
              public void onError(Throwable error) {
                  // Transaction failed and was automatically canceled.
              }
          });
      }
      

      【讨论】:

      • 这是我的保存代码,它保存数据但我的数据没有显示
      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 2015-02-06
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多