【问题标题】:How to use RLMArray to save an Array如何使用 RLMArray 保存数组
【发布时间】:2015-02-18 20:52:19
【问题描述】:

注意:我对 Realm 和 Swift 还很陌生,所以请原谅我不明白的任何明显的事情。

我有一个工作的 UITableView,我打算用任务填充它。我希望用户能够根据需要添加和删除任务,因此我不能对任务进行硬编码,并且我希望在应用程序启动之间保存任务。最明显的方法是创建一个保存在 Realm 中的数组。问题是,我不明白如何在 Realm 中保存数组。我已经阅读了 Realm 网站上的文档,但发现它相当令人困惑,因为我对 Swift 还是很陌生(而且它在 ObjC 中)。你将如何创建一个数组并保存它?我最初尝试过这个,当它不起作用时,我做了一些研究,发现 RLMArray 实际上不是一个数组:

let ToDoTasksArray: RLMArray = ["Task Goes Here", "Task Goes Here2"]

对此有任何帮助吗?谢谢!

编辑:

我也尝试将数组作为对象保存到 RLMObject 中:

realm.addObject(ToDoTasksArray)

但这也不起作用,这并不让我感到惊讶。数组不是对象。

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    Realm 保存从 RLMObject 派生的对象,因此您需要为您的任务定义类,例如:

    @interface Task : RLMObject
    
    @property NSString * task;
    @property NSString * description;
    @property NSDate * dueDate;
    ...
    
    @end
    
    RLM_ARRAY_TYPE(Task) // define RLMArray<Task>
    

    然后创建一个任务列表模型为:

    @interface TaskList : RLMObject
    
    @property RLMArray<Task> * tasks;
    
    @end
    

    现在您创建任务,将其添加到任务列表并保存:

    RLMRealm * realm = [RLMRealm defaultRealm];
    [realm beginWriteTransaction];
    
    Task * task = [Task new];
    task.task = @"Some new task";
    
    RLMArray <TaskList> * tasksLists = (RLMArray <TaskList> *)[TaskList allObjects];
    
    // You can manage multiple task lists here using unique primary key for each task list. I am assuming that we have only one list.
    TaskList * taskList = tasksLists.firstObject;
    [taskList.tasks addObject: task];
    
    [realm addOrUpdateObject: taskList];
    
    [realm commitWriteTransaction];
    

    希望这会有所帮助。

    抱歉,我忽略了您提到您正在使用 Swift。

    【讨论】:

    • 我需要一个 Obj-C 中的示例:P。谢谢。
    【解决方案2】:

    您首先需要设置您的模型,以便您的待办事项可以保存到领域。

    你需要做的就是在你的一个文件中包含这个(最好是 todo.swift 文件)

    class Todo: RLMObject {
      dynamic var name = ""
    }
    

    然后你可以通过这样做来创建你的前两个待办事项:

    var firstTodo = Todo()
    firstTodo.name = "My first thing todo!"
    
    var secondTodo = Todo()
    secondTodo.name = "My second thing todo!"
    

    然后你可以把它保存到领域

    let realm = RLMRealm.defaultRealm()
    realm.beginWriteTransaction()
    realm.addObject(firstTodo)
    realm.addObject(secondTodo)
    realm.commitWriteTransaction()
    

    现在您可以获取所有返回它们的数组的待办事项

    let arrayOfTodos = Todo.allObjects()
    

    如果我要创建一个方法来保存新的待办事项,我会做这样的事情

    func createNewTodo(todo: String){
        let todo = Todo()
        todo.name = todo
        let realm = RLMRealm.defaultRealm()
        realm.beginWriteTransaction()
        realm.addObject(todo)
        realm.commitWriteTransaction()
    }
    

    【讨论】:

    • 那么当用户添加任务时会发生什么?例如,当用户输入任务名称并单击完成时,使用您的方法,然后我需要为任务创建一个新变量 - 因此,如果用户有 20 个任务,那么我将有 20 个变量。除非我理解错了?
    • 这就是 RLMArray 发挥作用的地方,您可以将多个任务存储在一个数组中。
    • 没错,你会有 20 个不同的实例,每个实例代表一个特定的任务。您可以使用 NSArray 将它们作为批处理添加。 RLMArray 主要用于关系,所以如果一个任务有很多子任务
    • @yoshyosh,所以所有任务都必须保存为自己的类实例?不可能将任务保存为字符串,将其附加到数组中,然后保存整个数组? (只是要求确定。)
    • 正确,您可以传递一个数组并循环创建每个实例并将其添加到领域。您的数据仍存储在一个表中,然后通过从该表中调用 allObjects 您可以获得一个结果数组。如果你有一个 RLMObjects (Todo's) 数组,那么你可以使用 realm.addObjects(myArrayOfRLMObjects)。然后,Realm 将知道如何将每个对象作为单独的项目存储在表中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多