当前位置: 首页 > 知识库问答 >
问题:

Realm/Xamarin.Forms/Android/C#:数据未跨运行保存

令狐凌
2023-03-14

我已经实现了我认为是Realm的一个非常普通的用法:

public class MyObj : RealmObject
{
   [PrimaryKey]
   public string Key { get; set; }
   public bool Value { get; set; }
}

然后,在我的应用程序中:

using(Realm r = Realm.GetInstance()) {
    var c1 = r.All<MyObj>().Count();
}

其返回零。

然后我添加一个对象:

using(Realm r = Realm.GetInstance()) {
    r.Write(() =>
    {
       var obj = new MyObj() { Key = "test", Value = true };
       r.Add(obj);
    });
}

然后重新打开它并获取计数:

using(r = Realm.GetInstance()) {
    var c2 = r.All<MyObj>().Count();
}

c2是一个,正如预期的那样。到目前为止,一切顺利。

但是当我关闭应用程序并重新启动时,< code>c1(初始计数)是零,而不是一。< br >知道为什么吗?< br >

共有2个答案

凤扬
2023-03-14

是否在物理设备上部署?如果是这种情况,则可能是由于Android内置的自动备份和还原功能 - 当您部署应用程序时,它会将其视为安装并恢复上一个已知状态。

您可以在这里阅读:Android应用程序在卸载和重新安装后会记住其数据,但tl;dr is-转到设置并关闭“自动恢复”或更新您的清单以指示Android不要备份数据。

秦皓君
2023-03-14

很抱歉,我们看不到您应用的其他代码。

但是您可以通过在浏览器中输入关键字Xamarin.Forms-使用Realm Database来引用文章。即使在重新启动应用程序后,它也能正常工作。

您还可以在此处查看完整示例。

主要代码是:

public partial class MainPage : ContentPage
    {
        List<OptionItems> optionItems = new List<OptionItems>();
        Student editStudent;
        public MainPage()
        {
            InitializeComponent();
            imgBanner.Source = ImageSource.FromResource("XamarinFormsRelam.images.banner.png");
            var realmDB = Realm.GetInstance();
            List<Student> studentList = realmDB.All<Student>().ToList();
            listStudent.ItemsSource=studentList;
        }

        private void btnAdd_Clicked(object sender, EventArgs e)
        {
            var realmDB = Realm.GetInstance();
            var students= realmDB.All<Student>().ToList();
            var maxStudentId = 0;
            if (students.Count!=0)
                 maxStudentId = students.Max(s=>s.StudentID);
            Student student = new Student()
            {
                StudentID = maxStudentId + 1,
                StudentName = txtStudentName.Text
            };
            realmDB.Write(() =>
            {
                realmDB.Add(student);
            });
            txtStudentName.Text = string.Empty;
            List<Student> studentList = realmDB.All<Student>().ToList();
            listStudent.ItemsSource = studentList;
        }
        private async void listOptions_ItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            var realmDB = Realm.GetInstance();
            OptionItems selectedItem = optionList.SelectedItem as OptionItems;
            if (selectedItem != null)
            {
                switch (selectedItem.OptionText)
                {
                    case "Edit":
                        popupOptionView.IsVisible = false;
                        popupEditView.IsVisible = true;
                        editStudent = realmDB.All<Student>().First(b => b.StudentID == selectedItem.StudentId);
                        txtEditStudentName.Text = editStudent.StudentName;
                        break;

                    case "Delete":
                        var removeStudent = realmDB.All<Student>().First(b => b.StudentID == selectedItem.StudentId);
                        using (var db = realmDB.BeginWrite())
                        {
                            realmDB.Remove(removeStudent);
                            db.Commit();
                        }
                        await DisplayAlert("Success", "Student Deleted", "OK");
                        popupOptionView.IsVisible = false;
                        List<Student> studentList = realmDB.All<Student>().ToList();
                        listStudent.ItemsSource = studentList;
                        break;

                    default:
                        popupOptionView.IsVisible = false;
                        break;
                }
                optionList.SelectedItem = null;
            }
        }
        protected override void OnAppearing()
        {
            base.OnAppearing();
            var realmDb = Realm.GetInstance();
        }

        private void listStudent_ItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            Student selectedStudent = listStudent.SelectedItem as Student;
            if(selectedStudent!=null)
            {
                optionItems.Add(new OptionItems { OptionText = "Edit",StudentId=selectedStudent.StudentID});
                optionItems.Add(new OptionItems { OptionText = "Delete", StudentId = selectedStudent.StudentID });
                optionItems.Add(new OptionItems { OptionText = "Cancel"});
                optionList.ItemsSource = optionItems;
                popupOptionView.IsVisible = true;
            }
        }

        private void Button_Clicked(object sender, EventArgs e)
        {
            popupEditView.IsVisible = false;
        }

        private async void Button_Clicked_1(object sender, EventArgs e)
        {
            var realmDB = Realm.GetInstance();
            var selectedStudent = realmDB.All<Student>().First(b => b.StudentID == editStudent.StudentID);
            using (var db = realmDB.BeginWrite())
            {
                editStudent.StudentName = txtEditStudentName.Text;
                db.Commit();
            }
            await DisplayAlert("Success", "Student Updated","OK");
            txtEditStudentName.Text = string.Empty;
            popupEditView.IsVisible = false;
        }
    }
 类似资料:
  • 我在应用程序中使用SQLite数据库。直到最近一切都很顺利。现在,每当我从Studio在我的Android设备上进行新的构建时,一切都会重置到几天前的状态。相同的项目是存在的,并且我对它们所做的所有更改都丢失了。

  • Im使用firebase,由于某些原因,我的代码没有推送数据,并且Im没有在firebase URL中看到数据。我的密码是这样的 我得到警报“保存”,但我无法在firebase URL中找到数据。 此外,为Firebase中的每个url提供的API键有什么用途。 更新:这种情况发生在IE10中。在其他浏览器中,它工作得很好

  • 问题内容: 我目前正在尝试创建一个包含人名和ip的sqlite数据库,虽然我的代码在运行时似乎可以正常运行,但是在运行 下面的代码后在终端中运行时,数据却无法显示。它和都在〜/ Desktop / SQL中运行 我的计算机正在运行OSX 10.11.4,python 3.4和SQLite 3.14.1 我尝试将ips更改为main.ips并返回 问题答案: 您似乎没有提交到数据库。您需要在关闭连接

  • 我想让IntentService在后台运行,即使应用程序被终止。但如果我从最近的屏幕上删除我的应用程序,我的服务就会停止。我怎样才能避免这种情况?换句话说,即使我的应用关闭了,最近的应用也无法运行,我该如何保持我的服务运行? 我的前台服务: 我的常数: 我的清单: 当应用程序打开时,我看到服务正在运行。当我通过home按钮最小化应用程序时,它仍在运行。当我通过后退按钮关闭应用程序时,它仍在运行。但

  • 问题内容: 我在活动中创建了一个领域对象。我需要能够在我创建的服务中访问该对象。但是在服务中创建Realm对象时出现错误 java.lang.IllegalStateException:来自错误线程的领域访问。只能在创建对象的线程上访问领域对象 现在我理解这意味着,因为领域对象是在我的活动上创建的,所以我无法从后台线程访问它。但是,除了创建自己的自定义处理程序线程外,我没有找到其他简便的方法,但这

  • 我是Android中Proguard的新手,想向社区提出一个问题。如果我在app gradle(模块)中将minify和shrink设置为true,这会保护我在Java类中定义的任何常数吗?