java - io.realm.exceptions.RealmIOException: 无法打开 3
问题描述
我试图为我的领域数据库进行备份,然后我收到此错误并指出realms.writeCopyTo(exportRealmFile);
. 我想也许我得到了这个错误,因为我试图将 3 个领域放在一个文件中或类似的东西中。如果是这样,我怎样才能在一个文件中备份 3 个领域?如果不是,我怎样才能让它运行?
这是错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jmnapps.expensetracker, PID: 4987
io.realm.exceptions.RealmIOException: Failed to open 3
at io.realm.internal.Group.nativeWriteToFile(Native Method)
at io.realm.internal.Group.writeToFile(Group.java:216)
at io.realm.Realm.writeEncryptedCopyTo(Realm.java:1077)
at io.realm.Realm.writeCopyTo(Realm.java:1057)
at com.jmnapps.expensetracker.ui.accounts.AccountsFragment.BackupCategories(AccountsFragment.java:281)
at com.jmnapps.expensetracker.ui.accounts.AccountsFragment$3.onClick(AccountsFragment.java:208)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
这是我执行领域备份的代码
public static AccountsFragment newInstance(){
return new AccountsFragment();
// Required empty public constructor
}
public AccountsFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_account, container, false);
btnSync = (Button)rootView.findViewById(R.id.btnsync);
btnRestore = (Button)rootView.findViewById(R.id.btnrestore);
btnBackup = (Button)rootView.findViewById(R.id.btnBackup);
btnLogout=(Button)rootView.findViewById(R.id.btnLogout);
userPicture=(CircleImageView)rootView.findViewById(R.id.userprofilepic);
userName = (TextView)rootView.findViewById(R.id.personName);
userEmail=(TextView)rootView.findViewById(R.id.personEmail);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mMainActivityListener.setMode(MainActivity.NAVIGATION_MODE_STANDARD);
mMainActivityListener.setTitle("Account");
//GoogleApiClient client = new GoogleApiClient.Builder(getContext()).addApi(AppIndex.API).build();
mCategoryList = new ArrayList<>();
// mCategoriesAdapter = new CategoriesAdapter(mCategoryList, this);
RealmConfiguration realmConfig = new RealmConfiguration.Builder(getContext()).build();
// Get a Realm instance for this thread
realm = Realm.getInstance(realmConfig);
expenseList = realm.where(Expense.class).findAll();
categoryList = realm.where(Category.class).findAll();
reminderList = realm.where(Reminder.class).findAll();
String facebookUserId = "";
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String fbuserName = user.getDisplayName();
String fbuserEmail = user.getEmail();
Uri fbuserPhoto = user.getPhotoUrl();
// find the Facebook profile and get the user's id
for(UserInfo profile : user.getProviderData()) {
// check if the provider id matches "facebook.com"
if(FacebookAuthProvider.PROVIDER_ID.equals(profile.getProviderId())) {
facebookUserId = profile.getUid();
}
}
String photoUrl = "https://graph.facebook.com/" + facebookUserId + "/picture?height=500";
userName.setText(fbuserName);
userEmail.setText(fbuserEmail);
Picasso.get()
.load(fbuserPhoto)
.into(userPicture);
//userName.setText(fbuserName);
//userEmail.setText(fbuserEmail);
//Picasso.get()
//.load(fbuserPhoto)
//.into(userPicture);
btnSync.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
btnRestore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
btnBackup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BackupCategories();
}
});
btnLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Dlogout = new Dialog(getContext());
Dlogout.setContentView(R.layout.layout_logout);
Dlogout.setTitle("Personal Expense Tracker");
btnOkay = (Button)Dlogout.findViewById(R.id.btnokay);
btnOkay.setEnabled(true);
btnCancel=(Button)Dlogout.findViewById(R.id.btncancel);
btnCancel.setEnabled(true);
btnOkay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
userName.setText("");
userEmail.setText("");
userPicture.setImageResource(R.drawable.defaultuser);
eraseCategories();
//SIGN OUT
FirebaseAuth.getInstance().signOut();
LoginManager.getInstance().logOut();
Intent i = new Intent(getActivity(), SignInActivity.class);
startActivity(i);
((Activity) getActivity()).overridePendingTransition(0, 0);
}
});
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Dlogout.dismiss();
}
});
Dlogout.show();
}
});
}
public void eraseCategories() {
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmResults<Expense> expdel = realm.where(Expense.class).findAll();
RealmResults<Category> catdel = realm.where(Category.class).findAll();
RealmResults<Reminder> remdel = realm.where(Reminder.class).findAll();
expdel.clear();
catdel.clear();
remdel.clear();
}
});
}
public void BackupCategories() {
RealmConfiguration realmConfig = new RealmConfiguration.Builder(getApplicationContext()).build();
Realm realms = Realm.getInstance(realmConfig);
File exportRealmFile;
EXPORT_REALM_PATH.mkdirs();
try {
// create a backup file
exportRealmFile = new File(EXPORT_REALM_PATH, EXPORT_REALM_FILE_NAME);
// if backup file already exists, delete it
exportRealmFile.delete();
// copy current realm to backup file
realms.writeCopyTo(exportRealmFile);
} catch (IOException e) {
e.printStackTrace();
}
String msg = "File exported to Path: " + EXPORT_REALM_PATH + "/" + EXPORT_REALM_FILE_NAME;
Toast.makeText(activity.getApplicationContext(), msg, Toast.LENGTH_LONG).show();
Log.d(TAG, msg);
realms.close();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
}
解决方案
代码工作正常我只需要使用物理 Android 设备而不是模拟器。因为它在存储目录中有问题