ios 数据库,ios 怎么将数据库存储到当前工程下
各位老铁们好,相信很多人对ios 数据库都不是特别的了解,因此呢,今天就来为大家分享下关于ios 数据库以及ios 怎么将数据库存储到当前工程下的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
中国内陆有iPhone数据库嘛
中国内陆有iPhone数据库。
苹果手机也是有国行的版本所以中国内陆是有iPhone数据库的。
iPhone是苹果公司(Apple Inc.)发布搭载iOS操作系统的系列智能手机。截至2021年9月,苹果公司(Apple Inc.)已发布32款手机产品,初代:iPhone,最新版本:iPhone 13 mini,iPhone 13,iPhone 13 Pro, iPhone 13 Pro Max;iPhone系列产品静音键在设备正面的左侧,iPhone系列机型自iPhone 4之后配置Apple Silicon自研芯片。Touch ID在iPhone 5s上首次出现。iPhone 6s和iPhone 6s Plus首次在屏幕上加入了压力感应触控3Dtouch功能。无线充电在iPhone8、iPhone 8 Plus机型首次出现,采用Qi(Chee)无线充电标准。
ios 怎么读取数据库的第几个表文件
一、沙盒机制
1、什么是沙盒?
每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立、封闭、安全的空间,叫做沙盒。
2、沙盒机制(SandBox)
沙盒是一种安全体系。
它规定了应用程序只能在为该应用程序创建的文件夹(沙盒)内访问文件,不可以访问其它沙盒内的内容(iOS8之后已经部分开放访问)。
所有的非代码文件都保存在这个地方,比如图片、声音、属性列表(plist)、sqlite数据库和文本文件等。
3、沙盒机制的特点:
每个应用程序的活动范围都限定在自己的沙盒里。
不能随意跨越自己的沙盒去访问别的应用程序沙盒中的内容。
应用程序向外请求或接收数据都需要经过权限认证。
4、查找某个应用程序的沙盒有两种方式
第一种:
点击[前往]->同时按住Alt键->选中[资源库]->选中Developer文件夹->CoreSimulator->Devices->59DB5213FA4C4DACB3671326E0201C01->data->Containers->Data->Application->01EA9151E7BC4A19A39D38D61D4356A0
红色字体的路径表示设备(模拟器)的路径
蓝色字体的路径表示应用程序沙盒的路径
代码实现(举例:获取Documents和Caches目录路径):
第二种:
应用程序的沙盒目录下会有三个文件夹Documents、Library(下面有Caches和Preferences目录)、tmp。
Documents:存储永远不会被删除的文件,会被iTunes同步,会备份到电脑上,如果需要可以从电脑中取出(在这个文件夹中不能存储过大的文件:如视频,音频,图片)【在程序退出的时候不会被删除,但是会被同步】。
Library:
Caches(缓存):这个文件夹的作用主要是用来缓存一些像视频、音频、图片这样的内容(SDWebImage缓存的图片就存在这个文件夹中)【在程序退出的时候不会被删除,也不会被同步】。
Preferences(偏好设置):保存应用程序的偏好设置,iTunes会自动备份此目录,这个目录中的内容会使用NSUserDefaults去取。
tmp:临时文件夹用来存取临时数据,临时数据是说删除就删除,在应用程序重启的时候都会被删除掉,不会被备份,iTunes也不会同步该目录。
代码实现(获取Documents和Library目录路径):
tmp文件查找方式:
二、简单对象的写入与读取
1、iOS中提供4种简单对象类型可以直接进行文件存取:NSString(字符串)、NSArray(数组)、NSDictionary(字典)、NSData(数据)。包括他们的子类。
2、简单对象的写入/读取:
代码示例(字符串):
成功写入沙盒的文件:
代码示例(图片):
成功写入沙盒的图片:
三、复杂对象的写入与读取
1、复杂对象是指在Foundation框架内不存在的数据类,如自定义Person类无法再程序内通过writeToFile:这个方法写入到文件内。
2、归档与反归档(解档)
归档就是通过将复杂对象(自定义Person类型的对象)转换为NSData类型对象,即为复杂对象的本地化,这个对象必须遵守NSCoding协议,并实现协议中的两个方法。
复杂对象->归档->NSData->writeToFile。
反归档就是将NSData转换为复杂对象。
读取文件->NSData->反归档->复杂对象。
代码示例:
ios 怎么将数据库存储到当前工程下
在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题。将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好。下面介绍一下数据保存的方式:
1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。例如对Possession对象归档保存。
定义Possession:
@interface Possession:NSObject<NSCoding>{//遵守NSCoding协议
NSString*name;//待归档类型
}
@implementation Possession
-(void)encodeWithCoder:(NSCoder*)aCoder{
[aCoder encodeObject:name forKey:@"name"];
}
-(void)initWithCoder:(NSCoder*)aDecoder{
name=[[aDeCoder decodeObjectforKey:@"name"] retain];
}
归档操作:
如果对Possession对象allPossession归档保存,只需要NSCoder子类NSKeyedArchiver的方法archiveRootObject:toFile:即可。
NSString*path= [self possessionArchivePath];
[NSKeyedArchiver archiveRootObject:allPossessions toFile: path ]
解压操作:
同样调用NSCoder子类NSKeyedArchiver的方法unarchiveRootObject:toFile:即可
allPossessions= [[NSKeyedUnarchiver unarchiveObjectWithFile:path] retain];
缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
2.NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。具体实现为:
保存数据:
NSUserDefaults*defaults=[NSUserDefaults standardUserDefaults];
NSString*name=@”default string“;
[defaults setObject:firstName forKey:@"name"];
//获得UIImage实例
UIImage*image=[[UIImage alloc]initWithContentsOfFile:@"photo.jpg"];
NSData*imageData= UIImageJPEGRepresentation(image, 100);//UIImage对象转换成NSData
[defaults synchronize];//用synchronize方法把数据持久化到standardUserDefaults数据库
读取数据:
NSUserDefaults*defaults=[NSUserDefaults standardUserDefaults];
NSString*name= [defaults objectForKey:@"name"];//根据键值取出name
NSData*imageData= [defaults dataForKey:@"image"];
UIImage*Image= [UIImage imageWithData:imageData];//NSData转换为UIImage
3. Write写入方式:永久保存在磁盘中。具体方法为:
第一步:获得文件即将保存的路径:
NSArray*documentPaths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);//使用C函数NSSearchPathForDirectoriesInDomains来获得沙盒中目录的全路径。该函数有三个参数,目录类型、he domain mask、布尔值。其中布尔值表示是否需要通过~扩展路径。而且第一个参数是不变的,即为NSSearchPathDirectory。在IOS中后两个参数也是不变的,即为:NSUserDomainMask和 YES。
NSString*ourDocumentPath=[documentPaths objectAtIndex:0];
还有一种方法是使用NSHomeDirectory函数获得sandbox的路径。具体的用法为:
NSString*sandboxPath= NSHomeDirectory();
// Once you have the full sandbox path, you can create a path from it,但是不能在sandbox的本文件层上写文件也不能创建目录,而应该是此基础上创建一个新的可写的目录,例如Documents,Library或者temp。
NSString*documentPath= [sandboxPath
stringByAppendingPathComponent:@"Documents"];//将Documents添加到sandbox路径上,具体原因前面分析了!
这两者的区别就是:使用NSSearchPathForDirectoriesInDomains比在NSHomeDirectory后面添加Document更加安全。因为该文件目录可能在未来发送的系统上发生改变。
第二步:生成在该路径下的文件:
NSString*FileName=[documentDirectory stringByAppendingPathComponent:fileName];//fileName就是保存文件的文件名
第三步:往文件中写入数据:
[data writeToFile:FileName atomically:YES];//将NSData类型对象data写入文件,文件名为FileName
最后:从文件中读出数据:
NSData data=[NSData dataWithContentsOfFile:FileName options:0 error:NULL];//从FileName中读取出数据
4. SQLite:采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。还是一步步来吧!
第一步:需要添加SQLite相关的库以及头文件:在项目文件的Build Phases下,找到Link Binary Library(ies),添加libsqlite3.0.dylib(libsqlite3.dylib与前者的区别暂时不知,两者应该差不多);在项目文件中头文件或者源文件中添加头文件#import"/usr/include/sqlite3.h"
第二步:开始使用SQLite:
NSArray*documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString*databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"mydb"];
//上面两句已经比较熟悉了吧!
//打开数据库
if(sqlite3_open([databaseFilePath UTF8String],&database)==SQLITE_OK){
NSLog(@"sqlite dadabase is opened.");
}
else{ return;}//打开不成功就返回
在打开了数据库的前提下,如果数据库没有表,那就开始建表了哦!
char*error;
const char*createSql="create table(id integer primary key autoincrement, name text)";
if(sqlite3_exec(database, createSql, NULL, NULL,&error)==SQLITE_OK){
NSLog(@"create table is ok.");
}
else
{
NSLog(@"error:%s",error);
sqlite3_free(error);//每次使用完毕清空error字符串,提供给下一次使用
}
建表完成之后,就开始插入记录:
const char*insertSql="insert into a person(name) values(‘gg’)";
if(sqlite3_exec(database, insertSql, NULL, NULL,&error)==SQLITE_OK){
NSLog(@"insert operation is ok.");
}
else
{
NSLog(@"error:%s",error);
sqlite3_free(error);//每次使用完毕清空error字符串,提供给下一次使用
}
下一步,查询记录:
const char*selectSql="select id,name from a person";
sqlite3_stmt*statement;
if(sqlite3_prepare_v2(database,selectSql,-1,&statement, nil)==SQLITE_OK){
NSLog(@"select operation is ok.");
}
else
{
NSLog(@"error:%s",error);
sqlite3_free(error);
}
while(sqlite3_step(statement)==SQLITE_ROW){
int _id=sqlite3_column_int(statement, 0);
NSString*name=(char*)sqlite3_column_text(statement, 1);
NSLog(@"row>>id%i, name%s",_id,name);
}
sqlite3_finalize(statement);
最后,关闭数据库:
sqlite3_close(database);
注意:写入数据库,字符串可以采用char方式,而从数据库中取出char类型,当char类型有表示中文字符时,会出现乱码。这是因为数据库默认使用ascII编码方式。所以要想正确从数据库中取出中文,需要用NSString来接收从数据库取出的字符串。
文章到此结束,如果本次分享的ios 数据库和ios 怎么将数据库存储到当前工程下的问题解决了您的问题,那么我们由衷的感到高兴!