对不起,我的英语不是我的母语。
我想开发具有以下基本功能的应用程序:
- 用户可以创建带有子任务的任务。层次级别应该是无限的,这样子任务就可以有自己的子任务,依此类推
- 用户可以创建标记,每个任务都可以有无限级别的标记,因此用户可以查看已被某些标记标记的所有任务
- 任务应该与云同步
- 它应该工作得很快。因此,例如,用户在转换下一级任务或显示具有不同标签的项目时不会出现任何延迟
嗯,还有很多其他功能,比如提醒之类的,但它与这种选择的纯JSON、nosql-db或sqlite无关。
问题是什么更适合此功能?
例如:
- 在sql中,我们必须将子任务的ID存储在模式中的某个位置,并为n级层次结构执行O(n)查询,但在json中这相当容易。我们可以将tasks对象与作为其子任务的任务数组一起使用。或者在xml中(我不知道是否可以在JSON中实现),我们可能只需要一些子任务ID的数组。我应该选择什么,你觉得怎么样
- 在JSON中,我可以使用名为"标记"的字符串项。每个任务都可以有一组标签,非常简单。在sql中,我必须有另一个表"标签",它将有所有标签和所有任务ID,每个标签和ID对都是唯一的,这是一种冗余
- 使用JSON可以轻松地与云同步。我可以只拥有一个包含所有任务的大文件,并根据最新更改的位置将其从服务器上传或上传到服务器(好吧,基本上)。但有两个问题。但通过这种方式,我会传输所有文件,而更改很少,而且这种方式应用程序应该会消耗更多的流量。也许没有SQL数据库可以解决这个问题?在sql中,应用程序也可以这样做,但它必须传输所有数据库数据
CouchbaseLite是一个适用于iOS和Android的嵌入式原生NoSQL数据库。它存储JSON文档,并通过云服务器透明地将它们同步到其他设备,具有专为多用户交互式应用程序中的细粒度访问控制而设计的安全模型。
Github在此转发:
- https://github.com/couchbase/couchbase-lite-ios
- https://github.com/couchbase/couchbase-lite-android
此处的邮件列表:https://groups.google.com/forum/#!论坛/移动沙发床
以下是一些想法-
couchDB被认为是一种很好的键值存储类型,可以跨多个服务器/客户端进行复制。对于您所描述的问题,这可能是一种合适的数据库类型。
否则,在您的场景中,使用任何类型的带有REST访问点的SQL/noSQL风格的数据库都将起作用。我认为MongoDB是一个特别好的选择,因为尽管它是密钥/值存储,但它可以很快为来自SQL单词的人学习-它还可以用json返回查询的答案-所以如果你使用NodeJS之类的东西作为REST服务器,它可以简化很多事情。
至于应用程序的一般结构,请参阅http://developer.asana.com/documentation/-这应该给你一个良好的起点。
由于这还没有被提出,SnappyDB有一个非常简单的API,并且是android的NoSQL-数据库。它可以持久化任何对象(该网站表示)。像这样使用
try {
DB snappydb = DBFactory.open(context); //create or open an existing databse using the default name
snappydb.put("name", "Jack Reacher");
snappydb.putInt("age", 42);
snappydb.putBoolean("single", true);
snappydb.put("books", new String[]{"One Shot", "Tripwire", "61 Hours"});
String name = snappydb.get("name");
int age = snappydb.getInt("age");
boolean single = snappydb.getBoolean("single");
String[] books = snappydb.getArray("books", String.class);// get array of string
snappydb.close();
} catch (SnappydbException e) {
}
存储可序列化对象:
AtomicInteger objAtomicInt = new AtomicInteger (42);
snappyDB.put("atomic integer", objAtomicInt);
AtomicInteger myObject = snappyDB.get("atomic integer", AtomicInteger.class);
存储任何对象:
MyPojo pojo = new MyPojo ();
snappyDB.put("my_pojo", pojo);
MyPojo myObject = snappyDB.getObject("non_serializable", MyPojo.class);
ThingDB是一个可嵌入的NoSQL数据库,具有MongoDB类API:
DB db = new DB("./db");
Doc doc=new Doc();
doc.put("name","test");
doc.put("age",31);
db.insert(doc);
//later you can find the saved doc:
Doc d=db.findOne(eq("name","test"));
您还可以将Doc转换为org.json.JSONObject:
JSONObject jo=d.toJSONObject();
https://github.com/neo-expert/thingdb