iOS 上的键值存储数据库

2024-04-07

在 iOS 上创建键值存储数据库的一个例子是雅普数据库 https://github.com/yaptv/YapDatabase.

但是,我没有这方面的经验,并且想了解是否值得使用它,而不是像 Core Data 或 FMDB 这样的东西。

我遇到的一个关键问题是:如何管理与该数据库的对象关系?

如果我可以避免对象关系,我正在寻找有关如何解决与另一个对象具有多对多关系的对象问题的建议或数据库设计技巧。

让我们考虑一个用例(这只是一个示例,以帮助解决此问题):

sender <<->> message <<->> recipient

sender has a: 
    photo_data, 
    name, 
    gender, 
    age, 
    email, 
    username, 
    twitter_id, 
    facebook_id, 
    sender_id

recipient has a: 
    photo_data, 
    name, 
    gender, 
    age, 
    email, 
    username, 
    twitter_id, 
    facebook_id, 
    recipient_id

message has a:
    text, 
    rich_text, 
    picture_data, 
    voice_data, 
    shared_url, 
    message_id

我考虑过使用message_id、sender_id和receiver_id来关联每个模型,但是有更好的方法吗?


我做过类似的事情,可能不完全合适,但可能会有所帮助。

我对聊天应用程序有类似的设置。每条消息都有一个发送者和接收者,但显然当前用户是两者之一。所以我将所有消息存储在它们自己的集合中,其中集合的名称是非当前用户的 id。

如果使用 YapDatabase,您将使用 YapCollectionsDatabase 类。

==编辑==

您首先要创建消息和用户类别:

@interface Message : NSObject <NSCoding> ...

@property (...) NSString *sender_id;
@property (...) NSString *recipient_id;
@property (...) NSString *user_id; // sender_id || recipient_id (non-current-user)

@property (...) NSDate *timestamp;
...
@end

@interface User : NSObject <NSCoding>

@property (...) NSString *user_id;
...
@end

现在将这些对象存储在数据库中。

我们从 YapCollectionsDatabase 开始。这是一个集合/键/值存储。因此,当新消息到达时,我们只需将其存储在正确的集合中

[dbConnection readWriteWithBlock:^(YapCollectionsDatabaseReadWriteTransaction *transaction){
    [transaction setObject:messsage
                    forKey:uuid
              inCollection:message.user_id
              withMetadata:message.timestamp];
}];

所以每条消息都是单独存储的。但它与对话中的所有其他消息一起放置在一个集合中。此外,添加新消息的速度很快,因为您只需向数据库添加一行。

sqlite 数据库内部如下所示: |集合|键|对象|元数据|

要查找对话数量,或获取对话的 userId:

[dbConnection readWithBlock:^(YapCollectionsDatabaseReadTransaction *transaction){
    conversationCount = [transaction numberOfCollections];
    conversationUserIds = [transaction allCollections];
}];

要获取对话中的消息数或消息的 ID:

[dbConnection readWithBlock:^(YapCollectionsDatabaseReadTransaction *transaction){
    messageCount = [transaction numberOfKeysInCollection:user_id];
    messageIdsSorted = [transaction allKeysOrdered:NSOrderedAscending
                                      inCollection:user_id];
}];

要从数据库中删除旧消息:

[dbConnection readWriteWithBlock:^(YapCollectionsDatabaseReadWriteTransaction *transaction){
    [transaction removeObjectsEarlierThan:twoWeeksAgo inCollection:user_id];
}];

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 上的键值存储数据库 的相关文章

  • Xcode 9 中的“addingPercentEncoding”是否损坏?

    在 Swift 3 x 和 Xcode 9 beta 2 中 使用addingPercentEncoding https developer apple com documentation swift string 1690785 addi
  • 如何更改已上传的 Firebase 存储图像文件名?

    我需要更改已上传到 firebase 存储中的文件名 因为 在 firebase 存储中上传图像后 我将 url 保存在 firebase 数据库中的特定子 文件夹 下 但是 当我将图像移动到另一个子 文件夹 时 我需要根据新名称更改存储中
  • NSPredicate 的 onFormat 字符串

    我想用 id 键对数据进行排序 我如何理解格式字符串的用途NSPredicate格式 我有一个100号的帖子 我的代码 let objectIDs posts map 0 id let predicate NSPredicate forma
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1
  • Obj-C / Swift 项目中的致命陷阱异常

    我开始将 Swift 代码集成到我的 Obj C 项目中 一切都进展顺利 但今天 当我更新到 Xcode 6 1 时 事情变得很糟糕 我从之前运行良好的 Swift 代码中收到了许多 陷阱 异常 第一次崩溃位于我的 UIFont 扩展中 这
  • 使用GCD实现并发读独占写模型

    我试图了解使用 Grand Central Dispatch GCD 实现控制资源访问的并发读独占写模型的正确方法 假设有一个 NSMutableDictionary 被大量读取并且偶尔更新 确保读取始终与字典状态一致的正确方法是什么 当然
  • 就SQL注入而言,哪种sql查询更安全

    我有两个 SQL 查询正在尝试更新sup and opp每次调用查询时 值分别为 1 和 1 第一个查询 query update disc set sup sup opp opp where did did int sup getnoof
  • Ios Swift制作字体切换粗体、斜体、boldItalic、正常而不改变其他属性

    我很惊讶 在 Swift 中简单地为现有字体设置粗体和斜体是如此复杂 我只是想通过在字体类上使用以下方法来简化事情 我希望将以下方法添加到已设置字体系列和字体大小的现有字体中 我需要保留这些并仅更改以下内容 setBold Shud 保留斜
  • NSURLConnection 的 URL 文件大小 - Swift

    我想在下载之前从 url 获取文件大小 这是 obj c 代码 NSURL URL NSURL URLWithString ExampleURL NSMutableURLRequest request NSMutableURLRequest
  • 斯威夫特/iOS。从导航堆栈中删除一些视图控制器

    这是我想做的 但我不确定这是否是正确的方法 所以请给我建议如何去做 我有初始 VC 和导航 VC 我从中推送第一个 VC 从中推送第二个 VC 接下来我介绍 来自第二个 VC 的 NavigationController 第三个 VC 现在
  • iOS Safari 通过单击按钮触发扫描信用卡

    您好 我目前正在创建一个测试应用程序 当用户单击文本字段名称或卡号时 扫描信用卡功能对我有用 我的问题是 我希望当用户单击 button1 时发生同样的情况 这应该打开相机来扫描卡并填充现有的文本字段 即名称 卡号和到期日期 额外的好处是
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • iOS AFNetworking downloadProgressBlock 计算返回负数

    我正在使用 AFNetworking 下载使用第三方类解析的数据 我之前曾多次使用 AFNetworking 执行类似的操作 但由于某种原因 当我调用 downloadProgressBlock 并进行计算以与我的进度条一起使用时 数字返回
  • 每次 UIScrollView 释放时都会发生内存泄漏

    在我的应用程序中 我有一个滚动视图和四个表格视图 每次拖动然后释放时 我都会泄漏 48 字节 这确实很重要 正如您所看到的 两组泄漏都有相同的来源 有人见过这样的泄漏吗 Edit 1 当我单击泄漏旁边的箭头时 我会得到泄漏的以下信息 您所看
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 如何判断handleOpenURL是在应用程序启动时调用还是在应用程序运行时调用?

    由于事件的顺序略有不同 具体取决于这两个场景中的哪一个正在进行 我希望能够区分出区别 有什么建议么 你不应该使用handleOpenURL因为它已被弃用 相反 使用application openURL sourceApplication
  • iTunes Connect 中缺少应用内购买部分

    我有一个应用程序处于准备提交状态 我还有该应用程序的应用程序内购买项目 上周我将它们链接到我的应用程序并提交以供审核 周末 开发商拒绝了它 现在我想重新提交修复后的版本 但 IAP 部分完全丢失 我怎样才能让它再次可见 我遇到过同样的问题
  • 如何按字母顺序对 NSMutable 数组中的自定义对象字段进行排序?

    我有一个自定义对象 例如 import
  • 如何更改phpmyadmin MySQL的IP地址?

    我在 xampp 中更改了 apache 的 IP 地址 但无法连接到 MySQL 我认为问题是我的 apache 不在我的数据库的同一网络上 我的 apache 位于 192 168 1 10 而我的 MySQL 位于 127 0 0 1

随机推荐