小编Lka*_*abo的帖子

我应该在哪里存储我的iPhone应用程序的SQLite数据库?

我在市场上有几个iOS应用程序,在所有这些应用程序中,我有一个连接到应用程序的小型SQLite数据库文件,为用户提供我的数据.安装后,用户可以通过更改某些选项来自定义此DB.

到目前为止,所有这些应用程序都存储了数据库NSDocumentsDirectory.提交我的上次更新后,它被拒绝将数据存储在错误的位置.对于被拒绝的应用,我将存储位置更改为NSCachesDirectory.我现在担心缓存将被清除并删除用户自定义.该应用程序仍然可以运行,数据库将被重新创建,但所有更改的表都将被重置,从而扰乱用户.

这种类型的数据库文件应该存储在何处?我把它放在Docs目录中是对的吗?根据Apple的说法,Docs目录是针对"关键数据",它是用户生成的数据或正确运行应用程序所需的数据.我觉得它属于那个类别,坚持我的用户设置是正确的操作,但谁想等待上诉?

database sqlite iphone ios

18
推荐指数
1
解决办法
1万
查看次数

Android 13 AD_ID 声明 - Play 管理中心无法识别

在面向 Android 13 (SDK 33) 的 Android 应用中,我已在应用清单中声明了所需的 AD_ID 权限:

<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

但是,当我将应用程序上传到播放控制台以进行发布时,会弹出以下错误,建议我需要声明权限。

Error
Your declaration on Play Console says that your app uses advertising ID. Your manifest file doesn't include the com.google.android.gms.permission.AD_ID permission.

If you don't include this permission in your manifest file, your advertising identifier will be zeroed out. This may break your advertising and analytics use cases, and cause loss of revenue. Learn more

You can remove these errors by updating your advertising ID declaration

info_outline
Apps …
Run Code Online (Sandbox Code Playgroud)

android google-play android-13

12
推荐指数
0
解决办法
1268
查看次数

Perform(_:inZoneWith:completionHandler:) 已弃用?或不?iOS 15

在 iOS 15 的 Xcode 13 beta 中,我收到一条消息,称perform(_:inZoneWith:completionHandler:)(CloudKit) 在 iOS 15 中已弃用并重命名为fetchRecords(matching:inZoneWith:desiredKeys:resultsLimit:completionHandler:)“但是...”

  1. Apple 文档网站未声明此方法已弃用:https://developer.apple.com/documentation/cloudkit/ckdatabase/1449127-perform

  2. Apple 正在展示 iOS 15 的其他弃用(另一种方法):https://developer.apple.com/documentation/cloudkit/ckdatabase/3794331-records/

  3. fetchRecords(matching:inZoneWith:desiredKeys:resultsLimit:completionHandler:)似乎不存在..还..( Value of type 'CKDatabase' has no member 'fetchRecords')

那么,这是否只是一个错误消息,因为它是测试版?我应该担心重写使用的函数perform(_:inZoneWith:completionHandler:)吗?

这是我的函数,我尝试将其改编为 fetchRecords,但它不存在。我尝试适应它,fetch(withQuery:completionHandler:但我有点迷失让它发挥作用..

(该函数只是从iCloud私有数据库中删除记录):

        let container = CKContainer(identifier: "MyContainerNameHere")
        let recordType = "DBName"
                
        //delete all saved icloud records
        let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true))

        container.privateCloudDatabase.perform(query, inZoneWith: nil) { (rec, err) in
            if let err = err {
                print(err.localizedDescription) …
Run Code Online (Sandbox Code Playgroud)

cloudkit ios15 xcode13

6
推荐指数
1
解决办法
1208
查看次数

了解使用新的 async/await API 获取 CKRecords 的结果

我对如何处理复杂的 Swift 数据类型、它们对变量的赋值以及访问其中的值有点困惑。希望有人能澄清以下问题:

当尝试从 SwiftUI 和 CloudKit 获取数据,并尝试重写 CK 函数以符合 async/await 时,我有以下代码行:

let result = try await container.privateCloudDatabase.records(matching: query)

现在这一行应该云私有数据库中获取与指定查询匹配的所有记录并返回一些 CKRecords

旧函数的执行方式如下:

container.privateCloudDatabase.perform(query, inZoneWith: nil) { (rec, err) in 
    for record in rec {
        print("Found this record: \(record)")
    }
}
Run Code Online (Sandbox Code Playgroud)

这非常有效,因为perform(_:inZoneWith:)会返回一个 CKRecord 和一个错误,它们在语句中被“分开”(rec, err) in并传递到循环中进行迭代。

使用新的 async/await 方法,我尝试简单地等待并将变量分配给找到的所有记录,然后迭代返回的数据,挑选 CKRecords 并执行我想要的任何任务。

我感到困惑的是,当我尝试以多种方式从返回的结果中挑选数据时,我只是收到错误。我不完全理解如何描述返回值的数据结构,我认为这是问题的根本原因。

我尝试了一些方法并收到以下错误消息:

如果我尝试:

let (result, err)  = try await container.privateCloudDatabase.records(matching: query)
Run Code Online (Sandbox Code Playgroud)

当我使用时(尝试将 CKRecords 附加到我之前创建的 CKRecords 数组中):

for record in result {
   self.myCKRecordArray.append(record)
}
Run Code Online (Sandbox Code Playgroud)

错误消息具体指出: …

ios swift cloudkit ios15

6
推荐指数
1
解决办法
2398
查看次数

SwiftUI 错误 - 列表更改锁定 UI -(旧标题:SwiftUI CoreData 获取非常慢)

更新 #4

  • 我重新排序了这篇文章,以便更轻松地阅读。您将在下面阅读的内容将详细介绍我在使用 SwiftUI 时遇到的错误。我最近请求 Apple 提供代码级别的支持,他确认了这一点,并要求我联系解决问题的反馈(也已完成,但尚未答复)。

错误是这样的:在 SwiftUI 视图中显示 List 或 ForEach 后,如果您通过更改列出的项目数来更改该视图,则 UI 在尝试计算已更改/需要更改的行数时会锁定。 .

我在 Apple 开发论坛中看到其他人遇到过这个错误。他们的临时解决方案是“将数组设置为空白”,从而在修改列出的数据集之前彻底清除列表大约 100 毫秒。这将充分避免用户使用数据数组迭代 List 或 ForEach 时的锁定。

问题是,对于 CoreData,按照本文中的描述使用,似乎没有任何方法可以清除推送的字母之间的列表(获取请求)。

在更新 #3 中,有一个 GitHub 项目显示了此问题的示例数据。

对解决方法的任何输入表示赞赏。

更新 #3

不好.. 正如这篇文章中所述,我能够从使用 CoreData 更改为本地 SQLite 数据库文件。我的结果是搜索和使用 CoreData 一样慢。我不知道这里发生了什么。但也许它与 SwiftUI 输出的渲染结果有关?无论哪种方式,搜索和显示大量数据似乎都是不可能的。

根据 J. Doe 的要求,我在 GitHub 上发布了一个示例项目,该项目演示了这个问题。这个项目可以在这里找到

我希望有人能看到我做错了什么。我很难相信这只是 iOS 的一个限制。

原帖

有任何想法吗?

我觉得我缺少一些基本的东西。我的获取请求(下面的代码)非常慢。我试图向 CoreData 模型添加一个索引,但有负面改进(来自下面的 J. Doe 的建议)。我想也许我需要以某种方式向 fetch 请求添加一个 fetchBatchSize 声明(想通了这一点 - 请参阅下面的更新 #2 - 没有帮助),但是使用 SwiftUI 中的属性包装器 @FetchRequest,似乎没有办法做这个。 …

sqlite xcode core-data swiftui

5
推荐指数
2
解决办法
1803
查看次数

SwiftUI - 如何访问“WindowScene”

在观看 WWDC 21 视频参考 StoreKit 2 时,他们引用了一些函数,其中他们让值 =WindowScene如下:

func manageSubscriptions() async {
    if let windowScene = self.view.window?.windowScene {
        do {
            try await AppStore.showManageSubscriptions(in: windowScene)
        } catch {
            //error
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

let 行出错并显示以下消息:Type of expression is ambiguous without more context

如果我尝试提供更多上下文,例如:

if let windowScene = (self.view.window?.windowScene)! as UIWindowScene {
Run Code Online (Sandbox Code Playgroud)

有人告诉我:Value of type 'MyStruct' has no member 'view'

我缺少什么,必须是简单的东西才能访问这个所需的 UI 元素?

谢谢

补充: 我想补充一点,我使用的是使用 SceneDelegate 和 AppDelegate 创建的 SwiftUI 应用程序,而不是简单的结构:App,结构类型。所以我猜我需要访问 SceneDelegate 中的某些内容才能获取正确的对象。

xcode swiftui

2
推荐指数
1
解决办法
4068
查看次数

SwiftUI:在枚举上切换 .sheet,不起作用

我有两个 Modal/Popover.sheet我想根据用户按下哪个按钮来显示。我已经设置enum了不同的选项并设置了默认选项。

预期行为:

当用户选择任何选项时,将显示正确的工作表。当用户 THEN 选择其他选项时,它还会显示正确的工作表。

观察到的行为:

在下面的例子中,当用户第一次选择第二个选项时,显示第一个工作表,并将继续显示直到用户选择第一个工作表,然后它会开始切换。

调试打印显示@State变量正在更改,但是,工作表演示不会观察到此更改并按上述方式显示工作表。有什么想法吗?

import SwiftUI


//MARK: main view:
struct ContentView: View {
    
    //construct enum to decide which sheet to present:
    enum ActiveSheet {
        case sheetA, sheetB
    }
    
    //setup needed vars and set default sheet to show:
    @State var activeSheet = ActiveSheet.sheetA //sets default sheet to Sheet A
    @State var showSheet = false
    
    
    var body: some View {
        
        
        VStack{
            
            Button(action: {
                self.activeSheet = .sheetA //set choice to …
Run Code Online (Sandbox Code Playgroud)

swiftui

1
推荐指数
1
解决办法
300
查看次数

在 Swift String.contains() 函数中使用正则表达式

在 Swift 中,我有一个 String Variable thisString。我想检查以确保字符串仅包含字母、数字和/或破折号 (-)。除了这样做之外:

if ( thisString.contains("$") || thisString.contains("%") ) {
  //reject
} else {
 //accept
}
Run Code Online (Sandbox Code Playgroud)

对于每个不受欢迎的角色,这很荒谬。我想不通。

理论上,我想用正则表达式做这样的事情:

if ( thisString.contains(regex([^a-zA-Z0-9-]) ) { 
  //reject
} else {
  //accept
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

swift

1
推荐指数
1
解决办法
4939
查看次数

Perl XML::LibXML 获取标签之外的数据

作为我上一个问题的后续问题(Perl XML::LibXML 从特定节点获取信息

给定以下 XML 数据,我无法弄清楚如何获取标记后显示的数据<tab/>(该标记没有结束标记,而不从该部分内的子节点获取所有数据?有关更多详细信息,请参阅下文:

XML 示例:

<title number="3">
<catchline>Uniform Agricultural Cooperative Association Act</catchline>
<chapter number="3-1">
<catchline>
General Provisions Relating to Agricultural Cooperative Associations
</catchline>
<section number="3-1-1">
<histories>
<history>
Amended by Chapter
<modchap sess="2010GS">378</modchap>
, 2010 General Session
</history>
<modyear>2010</modyear>
</histories>
<catchline>Declaration of policy.</catchline>
<tab/>
It is the declared policy of this state, as one means of improving the economic position of agriculture, to encourage the organization of producers of agricultural products into effective associations …
Run Code Online (Sandbox Code Playgroud)

xml perl xml-libxml

1
推荐指数
1
解决办法
105
查看次数

UIAlertViewDelegate类"self"实例在按下按钮之前被dealloc'd

我一直在寻找这个问题的解决方案几天,并找到了一些类似的帖子,但似乎没有人发布一个明确的答案,如何停止我正在使用dealloc'd的实例.希望我只是错过了,或者有人可以帮助我停止摧毁我的大脑..

我有一个class(LKNetworking)声明它符合UIAlertViewDelegate协议.目前它是一个子类NSObject,但是我已经尝试UIResponder但是要么产生相同的问题.

问题是我创建了一个UIAlert视图并将委托设置为self.UIAlert视图显示OK,但是LKNetworking调用它的Class实例立即被dealloc'd(我在NSLOG中显示),当我单击一个按钮时,消息被发送到一个解除分配的实例(LKNetworking alertView:clickedButtonAtIndex:]:message发送到解除分配的实例0x6e5ce40)

所以,我试图在.h文件中创建一个属性:

@property (strong, nonatomic) LKNetworking *strongNetworkingProperty
Run Code Online (Sandbox Code Playgroud)

然后我尝试将我的UIAlertView的委托设置为strongNetworkingProperty ivar并且消息似乎无处可去,所以这没有好处..

我看到一些答案里的人说,设置警戒意见delegatenil,但击败我的整个目的,因为我需要响应用户选择相应的行动..

以下LKNetworking是调用警报的方法的示例代码和delegate方法:

-(void)checkGameServerVersion: (float) serverGameVersion {
    if (serverGameVersion == GAMEVER) {
        NSLog(@"matched");
        // Continue flow here..
    } else {
        NSLog(@"not matched");
        //Game version does not match, end game, force upgrade 
        UIAlertView *oldVersion = [[UIAlertView alloc]initWithTitle:@"Ugrade Required" message:@"A new game version is available, Please update your game and try …
Run Code Online (Sandbox Code Playgroud)

iphone xcode ios ios5

0
推荐指数
1
解决办法
710
查看次数