如何使用RLMArray保存数组

Cod*_*eIt 6 realm ios swift

注意:我对Realm和Swift相当新,所以请原谅任何我不明白的明显事情.

我有一个工作的UITableView,我计划填充任务.我希望用户能够根据需要添加和删除任务,因此我无法对任务进行硬编码,并且我希望在应用程序启动之间保存任务.最明显的方法是创建一个在Realm中保存的数组.问题是,我不明白如何在Realm中保存数组.我已经阅读了Realm网站上的文档,但由于我自己仍然是Swift的新手(并且它在ObjC中),因此发现它相当混乱.你会如何创建一个数组并保存它?我最初尝试过这个,当它不起作用我做了一些研究,发现RLMArray实际上不是一个数组:

let ToDoTasksArray: RLMArray = ["Task Goes Here", "Task Goes Here2"]
Run Code Online (Sandbox Code Playgroud)

对此有何帮助?谢谢!

编辑:

我也尝试将数组保存为RLMObject作为对象,如下所示:

realm.addObject(ToDoTasksArray)
Run Code Online (Sandbox Code Playgroud)

但这也行不通,这并不让我感到惊讶.数组不是对象.

gag*_*wal 9

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

@interface Task : RLMObject

@property NSString * task;
@property NSString * description;
@property NSDate * dueDate;
...

@end

RLM_ARRAY_TYPE(Task) // define RLMArray<Task>
Run Code Online (Sandbox Code Playgroud)

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

@interface TaskList : RLMObject

@property RLMArray<Task> * tasks;

@end
Run Code Online (Sandbox Code Playgroud)

现在您创建Task,将其添加到TaskList并保存:

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];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

抱歉,我忽略了你提到你正在使用Swift.


yos*_*osh 6

首先需要设置模型,以便将待办事项保存到领域.

你需要做的只是在你的一个文件中(最好是todo.swift文件)

class Todo: RLMObject {
  dynamic var name = ""
}
Run Code Online (Sandbox Code Playgroud)

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

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

var secondTodo = Todo()
secondTodo.name = "My second thing todo!"
Run Code Online (Sandbox Code Playgroud)

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

let realm = RLMRealm.defaultRealm()
realm.beginWriteTransaction()
realm.addObject(firstTodo)
realm.addObject(secondTodo)
realm.commitWriteTransaction()
Run Code Online (Sandbox Code Playgroud)

现在你可以获取所有返回它们的todos

let arrayOfTodos = Todo.allObjects()
Run Code Online (Sandbox Code Playgroud)

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

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