2016-11-06 2 views
0

Я использую Realm для Android.Объект Realm не доступен, когда область закрыта. Android

У меня есть вопрос (не очень большая проблема), у меня есть эти строки кода:

Account account; 
.... 
realm = Realm.getDefaultInstance(); 
account = realm.where(Account.class).findFirst(); 
realm.close(); 
if (account.getJid().equals(mUser.getText().toString())) { // User is the same as logged before 
    launchLogin(mUser.getText().toString().split("@")[0],mPassword.getText().toString()); 

} 

Если я запустить приложение, когда выполнение прибывает в IF заявление, это крах, потому что account объект делает nt существует. Даже если существуют учетные записи в db. Но если переместить realm.close() внутри IF, то после запуска launchLogin (..), он работает.

Я понимаю, что учетная запись «исчезает», когда я закрываю область db. и я могу получить реальную проблему в будущем.

Так что я хочу знать, как я могу сделать «постоянным» этот тип проблемы. Я имею в виду, закрывать область после запросов, и объект все еще существует после него.

ответ

1

В дополнение к EpicPandaForces ответить, если вы действительно хотите чтобы закрыть область и отказаться от каких-либо преимуществ автоматического обновления. Предложения Realm, вы можете создать неуправляемую копию RealmObject, используя realm.copyFromRealm(realmObject);

+0

Я всегда чувствую, что я не могу копировать элементы из базы данных с нулевой копией, поэтому я специально не сделал этого, t включить опцию использования 'copyFromRealm' в моем ответе. : P Но да, это также «решает» ближайшую проблему. – EpicPandaForce

+1

Хм .. ОК, я понимаю. То, что действительно нужно для этого действия, - это проверить, что у меня есть учетная запись (она должна быть 1 в момент времени. Возможно, в будущем больше). Вот почему мне не нужна функция автоматического обновления. Но я буду учитывать @EpicPandaForce ответ для функций nex. Спасибо, товарищи – Shudy

1

Доступные экземпляры управляемого RealmObject могут быть доступны только из экземпляров Realm, которые не закрыты.

Following the official documentation, you should have an open instance for the UI thread bound to the lifecycle of the application itself.

Из документов:

// onCreate()/onDestroy() overlap when switching between activities so onCreate() 
// on Activity 2 will be called before onDestroy() on Activity 1. 

public class MyActivity extends Activity { 
    private Realm realm; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     realm = Realm.getDefaultInstance(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     realm.close(); 
    } 
} 

И

// Use onCreateView()/onDestroyView() for Fragments as onDestroy() might not be called. 
public class MyFragment extends Fragment { 
    private Realm realm; 

    @Override 
    public void onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
     realm = Realm.getDefaultInstance(); 
     View view = inflater.inflate(R.layout.my_fragment, parent, false); 
     return view; 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     realm.close(); 
    } 
} 

И для фоновых потоков:

// Run a non-Looper thread with a Realm instance. 
Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     Realm realm = null; 
     try { 
      realm = Realm.getDefaultInstance(); 
      // ... Use the Realm instance ... 
     } finally { 
      if (realm != null) { 
       realm.close(); 
      } 
     } 
    } 
}); 

thread.start(); 


После документации, проблема вы уже не будет происходить.

0

Вы должны открыть экземпляр Realm в начале фонового потока, закройте его в конце выполнения в данном фоновом потоке,

try { 
    realm = Realm.getDefaultInstance(); 
    account = realm.where(Account.class).findFirst(); 

    if (account.getJid().equals(mUser.getText().toString())) { // User is the same as logged before 
     launchLogin(mUser.getText().toString().split("@")[0],mPassword.getText().toString()); 

    } 
} finally { 
    if(realm != null) { 
      realm.close(); // important 
    } 
} 
Смежные вопросы