ios 之 数据库、地理位置、应用内跳转、推送、制作静态库、CoreData

第一节:数据库
常见的API
objectivec 复制代码
SQLite提供了一系列的API函数,用于执行各种数据库相关的操作。以下是一些常用的SQLite API函数及其简要说明:

1. `sqlite3_initialize`:
   - 初始化SQLite库。通常在开始使用SQLite之前调用,但如果没有调用,SQLite会在第一次需要时自动调用。

2. `sqlite3_shutdown`:
   - 清理SQLite库。在不再需要SQLite库时调用,用于释放所有由SQLite分配的资源。

3. `sqlite3_open`:
   - 打开一个新的数据库连接。如果指定的文件不存在,SQLite会尝试创建一个新的数据库文件。

4. `sqlite3_open_v2`:
   - 打开一个新的数据库连接,提供更多的控制选项,如只读打开、创建数据库文件等。

5. `sqlite3_close`:
   - 关闭一个打开的数据库连接。如果有未完成的准备语句或未关闭的BLOB句柄,会返回`SQLITE_BUSY`。

6. `sqlite3_close_v2`:
   - 关闭一个打开的数据库连接,但允许延迟关闭直到所有关联的语句和BLOB句柄都被关闭。

7. `sqlite3_exec`:
   - 执行一个SQL语句,并不返回查询结果。适用于执行INSERT、UPDATE、DELETE等操作。

8. `sqlite3_prepare_v2`:
   - 将SQL语句编译成一个准备语句(prepared statement),用于后续的绑定参数、执行和获取结果。

9. `sqlite3_step`:
   - 执行或推进一个准备语句。对于查询语句,它会返回`SQLITE_ROW`直到没有更多的数据。

10. `sqlite3_finalize`:
    - 销毁一个准备语句,释放与之相关的资源。

11. `sqlite3_bind_*`:
    - 一系列函数,用于将值绑定到准备语句的参数上。例如`sqlite3_bind_int`、`sqlite3_bind_text`等。

12. `sqlite3_column_*`:
    - 一系列函数,用于从执行结果中提取数据。例如`sqlite3_column_int`、`sqlite3_column_text`等。

13. `sqlite3_changes`:
    - 返回最近一次INSERT、UPDATE或DELETE操作所影响的行数。

14. `sqlite3_last_insert_rowid`:
    - 返回最后一次INSERT操作插入行的ROWID。

15. `sqlite3_errmsg`:
    - 返回最近一次SQLite操作的错误信息。

16. `sqlite3_busy_timeout`:
    - 设置当数据库被锁定时等待解锁的最长时间。

17. `sqlite3_backup_init`:
    - 初始化一个新的数据库备份操作。

18. `sqlite3_backup_step`:
    - 将数据从一个数据库传输到另一个数据库。

19. `sqlite3_backup_finish`:
    - 完成备份操作并释放所有相关资源。

20. `sqlite3_randomness`:
    - 用于填充缓冲区,生成一些随机数据。

21. `sqlite3_config`:
    - 用于配置SQLite的全局行为。

22. `sqlite3_db_config`:
    - 用于配置特定数据库连接的行为。

这些函数只是SQLite提供的众多API中的一部分。SQLite的API设计用于提供灵活性和控制,以满足不同应用程序的需求。在使用这些API时,应该注意正确处理错误代码,并在适当的时候释放资源,以避免内存泄漏或其他问题。
sqlite3_column* 的一些api
objectivec 复制代码
1. `sqlite3_column_blob`:
   - 用途:提取类型为BLOB(二进制大对象)的列数据。
   - 返回值:返回指向包含BLOB数据的缓冲区的指针。

2. `sqlite3_column_bytes`:
   - 用途:获取一个列数据的字节数。
   - 返回值:返回列数据的字节数。

3. `sqlite3_column_double`:
   - 用途:提取类型为浮点数的列数据。
   - 返回值:返回列数据的`double`类型值。

4. `sqlite3_column_int64`:
   - 用途:提取类型为64位整数的列数据。
   - 返回值:返回列数据的`sqlite3_int64`类型值。

5. `sqlite3_column_text16`:
   - 用途:提取类型为文本的列数据,返回的是UTF-16编码的文本。
   - 返回值:返回指向包含文本数据的缓冲区的指针。

6. `sqlite3_column_value`:
   - 用途:提取列数据,返回一个`sqlite3_value`类型的对象,可以用来进一步提取不同类型的数据或进行类型转换。
   - 返回值:返回`sqlite3_value`对象的指针。

7. `sqlite3_column_type`:
   - 用途:获取列数据的数据类型。
   - 返回值:返回一个整数,表示数据类型,如`SQLITE_INTEGER`、`SQLITE_FLOAT`、`SQLITE_TEXT`、`SQLITE_BLOB`或`SQLITE_NULL`。

这些函数通常在调用`sqlite3_step`函数后,且其返回值为`SQLITE_ROW`时使用,以从当前的查询结果中提取数据。使用这些函数时,需要传入准备好的语句对象(`sqlite3_stmt *`)和列的索引(从0开始)。根据列中存储的数据类型选择合适的`sqlite3_column_*`函数来获取数据。
objectivec 复制代码
1. `sqlite3_column_blob`:
   - 用途:提取类型为BLOB(二进制大对象)的列数据。
   - 返回值:返回指向包含BLOB数据的缓冲区的指针。

2. `sqlite3_column_bytes`:
   - 用途:获取一个列数据的字节数。
   - 返回值:返回列数据的字节数。

3. `sqlite3_column_double`:
   - 用途:提取类型为浮点数的列数据。
   - 返回值:返回列数据的`double`类型值。

4. `sqlite3_column_int64`:
   - 用途:提取类型为64位整数的列数据。
   - 返回值:返回列数据的`sqlite3_int64`类型值。

5. `sqlite3_column_text16`:
   - 用途:提取类型为文本的列数据,返回的是UTF-16编码的文本。
   - 返回值:返回指向包含文本数据的缓冲区的指针。

6. `sqlite3_column_value`:
   - 用途:提取列数据,返回一个`sqlite3_value`类型的对象,可以用来进一步提取不同类型的数据或进行类型转换。
   - 返回值:返回`sqlite3_value`对象的指针。

7. `sqlite3_column_type`:
   - 用途:获取列数据的数据类型。
   - 返回值:返回一个整数,表示数据类型,如`SQLITE_INTEGER`、`SQLITE_FLOAT`、`SQLITE_TEXT`、`SQLITE_BLOB`或`SQLITE_NULL`。

这些函数通常在调用`sqlite3_step`函数后,且其返回值为`SQLITE_ROW`时使用,以从当前的查询结果中提取数据。使用这些函数时,需要传入准备好的语句对象(`sqlite3_stmt *`)和列的索引(从0开始)。根据列中存储的数据类型选择合适的`sqlite3_column_*`函数来获取数据。
sqlite 中key值的类型
objectivec 复制代码
SQLite支持以下几种基本的数据类型(也称为存储类):

1. `NULL`:
   - 用于存储NULL值,表示该值是一个空值。

2. `INTEGER`:
   - 用于存储整数。根据数值的大小,可以使用1、2、3、4、6或8字节存储。

3. `REAL`:
   - 用于存储浮点数。通常是8字节的IEEE浮点数。

4. `TEXT`:
   - 用于存储文本字符串。SQLite使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)来存储文本。

5. `BLOB`:
   - 用于存储二进制大对象(Binary Large OBject)。BLOB类型的数据完全按照输入存储,不做任何转换。

除了这些基本类型,SQLite还有一个特殊的数据类型:

6. `NUMERIC`:
   - 这不是一个独立的数据类型,而是一个类型亲和性(type affinity)。在SQLite中,表的列可以被指定为NUMERIC亲和性,这意味着SQLite会根据存储的数据尝试使用INTEGER或REAL类型,如果这两种类型都不适合,它会将数据存储为TEXT。

SQLite的类型系统比较灵活,它使用动态类型,不强制数据类型。这意味着你可以在任何列中存储任何类型的数据,不过SQLite会根据列的声明类型(亲和性)尝试进行一些优化。例如,如果你声明一个列为INTEGER类型,SQLite会尽可能将存储在该列中的数据作为整数来处理
示例:用一个数据库文件来保存数据
objectivec 复制代码
1. 导入SQLite库:
   在你的Xcode项目中,你需要链接`libsqlite3.tbd`(或`libsqlite3.dylib`)库。
   你可以在项目的"Build Phases" -> "Link Binary With Libraries"中添加这个库。

2. 导入头文件:
   在你的Objective-C类中,导入SQLite的头文件:
   
   #import <sqlite3.h>


3. 打开数据库:
   使用`sqlite3_open`函数来打开一个数据库。如果数据库文件不存在,
   SQLite会尝试创建一个新的数据库。

   sqlite3 *database;
   NSString *dbPath = @"path_to_your_database_file.db";

   if (sqlite3_initialize() != SQLITE_OK) {
       //未初始化
   }

   if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
       // Database opened successfully
   } else {
       // Failed to open database
   }
   

4. 执行SQL语句:
   你可以使用`sqlite3_exec`来执行SQL语句,例如创建表、插入数据等。
   
   const char *createTableSQL ="CREATE TABLE IF NOT EXISTS People (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT)";
   char *error;
   if (sqlite3_exec(database, createTableSQL, NULL, NULL, &error) == SQLITE_OK) {
       // Table created successfully
   } else {
       // Failed to create table
       sqlite3_free(error);
   }
  

5. 查询数据:
   使用`sqlite3_prepare_v2`,`sqlite3_step`和`sqlite3_finalize`来查询数据。
   
   const char *querySQL = "SELECT ID, Name FROM People";
   sqlite3_stmt *statement;
   if (sqlite3_prepare_v2(database, querySQL, -1, &statement, NULL) == SQLITE_OK) {
       while (sqlite3_step(statement) == SQLITE_ROW) {
           int personID = sqlite3_column_int(statement, 0);
           const unsigned char *name = sqlite3_column_text(statement, 1);
           NSLog(@"Person ID: %d, Name: %s", personID, name);
       }
       sqlite3_finalize(statement);
   } else {
       // Failed to execute query
   }
   

6. 关闭数据库:
   完成数据库操作后,使用`sqlite3_close`关闭数据库。
   
   sqlite3_close(database);


-------------示例里的一些api的解释----------------

1. `sqlite3_open`
   - **作用**: 打开一个数据库连接,如果数据库文件不存在还可以选择创建数据库。
   - **参数**: 
     - 第一个参数是要打开的数据库文件的路径(使用UTF-8字符串)。
     - 第二个参数是指向`sqlite3`指针的指针,它将被赋予数据库连接的句柄。
   - **返回值**: 返回`SQLITE_OK`(0)表示成功,或者一个错误代码表示失败。

2. `sqlite3_exec`
   - **作用**: 执行无返回结果的SQL语句,如创建表、插入、更新、删除等操作。
   - **参数**:
     - 第一个参数是`sqlite3`数据库连接句柄。
     - 第二个参数是要执行的SQL语句字符串。
     - 第三个参数是处理查询结果的回调函数,这里未用到设置为NULL。
     - 第四个参数是提供给回调函数的参数,这里未用到设置为NULL。
     - 第五个参数是错误信息的指针,当SQL语句执行出错将赋予指向动态分配错误描述文字的指针。
   - **返回值**: 返回`SQLITE_OK`(0)表示成功,或者一个错误代码表示失败。如果失败,错误信息将被写入第五个参数。

3. `sqlite3_prepare_v2`
   - **作用**: 将一个SQL语句编译成一个准备语句(prepared statement),并执行直到第一次`sqlite3_step`调用必需的准备。
   - **参数**:
     - 第一个参数是`sqlite3`数据库连接句柄。
     - 第二个参数是要执行的SQL查询字符串。
     - 第三个参数是SQL语句的长度(传入-1代表系统会根据SQL字符串自动计算长度)。
     - 第四个参数是路径到`sqlite3_stmt`的指针,最终它会指向准备情况(预编译的语句)。
     - 第五个参数是无视的,通常设置为NULL。
   - **返回值**: 返回`SQLITE_OK`表示成功创建,或者错误代码代表其他结果。

4. `sqlite3_step`
   - **作用**: 通过一个准备好的语句进行单步执行。可从查询中提取数据或者执行一个非查询的SQL命令。
   - **参数**:
     - 唯一的参数是编译好的`sqlite3_stmt`语句句柄。
   - **返回值**: 如果是查询并且有更多的数据,返回`SQLITE_ROW`。如果执行完成,返回`SQLITE_DONE`。如果有错误,返回相应的错误码。

5. `sqlite3_column_int`, `sqlite3_column_text`
   - **作用**: 从执行结果中取值。`sqlite3_column_int`用于获取int类型的列数据,`sqlite3_column_text`用于获取文本(字符串)数据。
   - **参数**:
     - 第一个参数是`sqlite3_stmt`对象。
     - 第二个参数是你想要获取的列的索引,从0开始。
   - **返回值**: 返回执行结果中根据索引查找到的相应类型的数据。

6. `sqlite3_finalize`
   - **作用**: 删除(释放)一个`sqlite3_stmt`对象。
   - **参数**:
     - 唯一参数就是被释放的`sqlite3_stmt`对象。
   - **返回值**: 如果成功释放,返回`SQLITE_OK`,失败则返回对应的错误码。

7. `sqlite3_close`
   - **作用**: 关闭一个打开的数据库连接。
   - **参数**:
     - 参数是待关闭的`sqlite3`数据库连接句柄对象。
   - **返回值**: 成功返回`SQLITE_OK`,如果有运行的`sqlite3_stmt`仍未完结,则返回`SQLITE_BUSY`等错误码。

8. `sqlite3_free`
   - **作用**: 用于释放由 SQLite 分配给错误信息字符串的内存的函数。当你使用 `sqlite3_exec` 
     - 或其他需要错误信息的 SQLite 函数时,如果发生错误,SQLite 会分配一块内存来存储错误描述的 
       字符串,并通过函数的参数返回这个字符串的地址。
     - 使用 `sqlite3_free` 函数来释放这块内存是很重要的,因为如果不释放,就会造成内存泄漏。这 
       是因为 SQLite 使用自己的内存分配器来分配和释放内存,所以你需要使用 SQLite 提供的函数来 
       释放由 SQLite 分配的内存
9. `sqlite3_bind_text`
   - **作用**: 用于将一个字符串值绑定到预备(prepared)语句的占位符(也称作绑定变量)上。预备 
              语句是数据库查询语言的一种,通常用于执行参数化查询,以增强安全性并提供对类似查询 
              重复执行的优化
   - 使用
     1. 首先,创建一个预备语句。
     2. 然后,使用 `sqlite3_bind_text` 函数将具体的文本值(如字符串)绑定到这个预备语句的一 
        个占位符上。
     3. 此占位符通常以问号(`?`)表示或使用具名参数占位符(如 `:name`)。
     4. 继续为预备语句的其他占位符(如果有的话)绑定适当的值。
     5. 最后,执行预备语句来对数据库进行查询或者更新。
第二节:定位地理位置
CoreLocation

获取两个经纬度之间的距离

地理位置反编码
第三节:MapKit


放大、缩小地图

添加大头针

导航

显示导航线

第四节:应用间的跳转

通过获取plist 文件中的URL Type ,来动态的获取URL Scheme

第五节:推送
本地推送

发送通知前要先注册通知

本地通知期间kill调App,通过点击通知横幅,执行对应的操作

设置category

判断App是否在前台
远程推送

​​​​​​​

程序刚启动时收到的推送

第六节:静态库

编译不同的架构

库的资源文件
边开发边调试

创建两个target,一个是app,一个是动态库/静态库,如果想使用静态库的方法,需要导入该文件

framework
第七节:CoreData

相关推荐
编程爱好者熊浪4 小时前
两次连接池泄露的BUG
java·数据库
TDengine (老段)6 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349846 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE7 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102167 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎7 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP8 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t8 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
安当加密8 小时前
Nacos配置安全治理:把数据库密码从YAML里请出去
数据库·安全
ColderYY8 小时前
Python连接MySQL数据库
数据库·python·mysql