data写入 swift - CSDN
精华内容
参与话题
  • 数据的存储无疑是软件开发中的重要课题。本文给初学者介绍下iphone开发中常见的文件读写,当然,我也是初学者~ iOS的文件存储采用的是“沙箱机制”,也就是应用程序只能访问自己的文件目录,每个应用程序的数据是...

     数据存储无疑软件开发重要课题。本文初学者介绍iphone开发常见文件读写,当然,我也是初学者~

    iOS的文件存储采用的是“沙箱机制”,也就是应用程序只能访问自己的文件目录,每个应用程序的数据是独立的,就像一个一个的沙箱一样。这种管理方法windows原来塞班那种文件管理方式适合移动平台。这种方式安全,很大程度上避免了流氓软件垃圾软件盗窃资料。

    查看模拟器应用程序在mac上的存储,就可以了解在iphone上文件是如何组织的。

    打开目录/Users/andy/Library/Application Support/iPhone Simulator/5.1/Applications就会看到模拟器上的程序文件夹,你会看到iphone每个应用程序都有自己的3个目录(Document,Library,tmp)

    Documents存放应用程序的数据。

    Library目录下面还有Preferences和Caches目录,Preferences目录存放应用程序的使用偏好,Caches目录与Documents很相 是可以存放应用程序的数据。

    tmp目录供应用程序存储临时文件。


    注意,如果你的设置没有设置为查看隐藏目录,你是看不到的,设置显示隐藏文件方法:在终端输入命令:defaults write com.apple.finder AppleShowAllFiles -bool true然后重启下finder。 


    在应用程序中获得自己的documents目录:

    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString * documentDirectory = [paths objectAtIndex:0];

    在上面的基础上,获得一个完整的文件路径和名字:

    NSString * file = [documentDirectory stringByAppendingPathComponent:@"file1.txt"];

    这就可以用file来创建,读取,和写入文件。


    iOS中数据存储常见的有四种方式: 属性列表、对象归档、ios嵌入式数据库(SQLite3)和Core Data(苹果提供的工具)

    一,用属性列表保存数据:

    该方法就是针对一些集合类调用writeToFile:atomically方法和initWithContentsOfFile 方法来写入和读取数据。

    这些集合类包括:NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate。在这里输入代码太麻烦了,无法识别回车换行,所以这个就不在这里举例了。

    二,归档方法保存自定义对象:

    属性列表方法简单易用,但是使用有局限性,就是无法保存自定义的数据类。要解决这个问题,我们看归档方法。归档方法实际就是 用 NSKeyedArchiver 对 自定义类进行编解码成 NSMutableData 后,再对NSMutableData实行序列化具体的编解码是由NSCoder实现的。举个例子就比较容易掌握。

    例子中我们保存4个值和一个名字字典。这些名字包括昵称,qq网名,微博网名,省份证名字。自定义类如下:

    头文件:

    #import <Foundation/Foundation.h> 

    @interface BIDFourLines : NSObject

    @property (copy, nonatomic) NSString *field1;

    @property (copy, nonatomic) NSString *field2;

    @property (copy, nonatomic) NSString *field3;

    @property (copy, nonatomic) NSString *field4;

    @property (copy, nonatomic) NSDictionary * names;

    @end


    实现文件:

    #import "BIDFourLines.h"

    #define kField1Key @"Field1"

    #define kField2Key @"Field2"

    #define kField3Key @"Field3"

    #define kField4Key @"Field4"

    #define kFieldArrayKey @"FieldArray"

    #pragma mark NSCoding

    - (void)encodeWithCoder:(NSCoder *)encoder {

     [encoder encodeObject:field1 forKey:kField1Key];

    [encoder encodeObject:field2 forKey:kField2Key];

    [encoder encodeObject:field3 forKey:kField3Key];

    [encoder encodeObject:field4 forKey:kField4Key];

    [encoder encodeObject:names forKey:kFieldArrayKey];

    }

    - (id)initWithCoder:(NSCoder *)decoder {

    if (self = [super init]) {

    field1 = [decoder decodeObjectForKey:kField1Key];

    field2 = [decoder decodeObjectForKey:kField2Key];

    field3 = [decoder decodeObjectForKey:kField3Key];

    field4 = [decoder decodeObjectForKey:kField4Key];

    names = [decoder decodeObjectForKey:kFieldArrayKey];

    }

    return self;

    }

    - (id)copyWithZone:(NSZone *)zone {

    BIDFourLines *copy = [[[self class] allocWithZone: zone] init];

    copy.field1 = [self.field1 copyWithZone:zone];

    copy.field2 = [self.field2 copyWithZone:zone];

    copy.field3 = [self.field3 copyWithZone:zone];

    copy.field4 = [self.field4 copyWithZone:zone];

    copy.names = [self.names copyWithZone:zone];

    return copy;

    }

    @end


    保存文件代码:

    - (void) saveTofile{

    BIDFourLines *fourLines = [[BIDFourLines alloc] init];

    fourLines.field1 = field1.text;

    fourLines.field2 = field2.text;

    fourLines.field3 = field3.text;

    fourLines.field4 = field4.text;

    fourLines.names = [NSDictionary dictionaryWithObjectsAndKeys:@"andy",@"nickName",@"王勃",@"idName",@"田鼠",@"qqName",@"大力哥",@"weiboName",nil ]; NSMutableData *data = [[NSMutableData alloc] init];

    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

    [archiver encodeObject:fourLines forKey:kDataKey];

    [archiver finishEncoding];

    [data writeToFile:[self dataFilePath] atomically:YES];

    }

    获取文件名函数:

    - (NSString *)dataFilePath {

    NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    return [documentsDirectory stringByAppendingPathComponent:@"archive"];

    }


    - (void) loadFileData{

    NSString *filePath = [self dataFilePath];

    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {

    NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];

    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

    BIDFourLines *fourLines = [unarchiver decodeObjectForKey:kDataKey];

    [unarchiver finishDecoding];

    field1.text = fourLines.field1;

    field2.text = fourLines.field2;

    field3.text = fourLines.field3;

    field4.text = fourLines.field4;

    NSDictionary * names = fourLines.names;

    if(names) {

    NSArray * array = [names allKeys];

      for (NSString * value in array) {

         NSLog(@"%@ is %@",value,[names objectForKey:value]);

       }  

      }

     }

    }








    展开全文
  • swift 数据存储

    2016-05-18 12:34:52
    plist 存储 利用沙盒根目录拼接“Documents”字符串  //存储  func saveArray()  {   // 1.获得沙盒根路径,不管是真机还是模拟机,用它是最合适不过了  let home: NSString = NSHomeDirectory... print

    1.plist 存储

    1.利用沙盒根目录拼接“Documents”字符串

        //存储

        func saveArray()

        {

            // 1.获得沙盒根路径,不管是真机还是模拟机,用它是最合适不过了

            let home:NSString =NSHomeDirectory()

            print(home)

            // 2.document路径

            let docPath:NSString = home.stringByAppendingPathComponent("Documents")

            // 3.新建数据

            let data:NSArray = ["jack","ffff"]

            //3.文件路径

            let filepath:NSString = docPath.stringByAppendingPathComponent("data.plist")

            //4.存储数据

            data.writeToFile(filepathasString, atomically:true)

            

        }


       //读取

        @IBActionfunc read() {

            //1.获得沙盒根路径

            let home:NSString =NSHomeDirectory()

            //2.document路径

            let doctPath:NSString = home.stringByAppendingPathComponent("Document")

            //3.文件路径

            let filepath:NSString = doctPath.stringByAppendingPathComponent("data.plist")

            //4.读取数据

            let data:NSArray? =NSArray(contentsOfFile: filepathasString)

            print("%@",data)

        }

    // 不建议采用,因为新版本的操作系统可能会修改目录名


    2.利用NSSearchPathForDirectoriesInDomains获取路径

    let array: NSArray = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask,false)

            //2.document路径

            let documents:NSString = array.objectAtIndex(0)as!NSString

            print(documents)




    2.偏好设置

        //存储

        @IBActionfunc save()

        {

            // 1.利用NSUserDefaults,就能直接访问软件的偏好设置(Library/Preferences)

            let defaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()

            print(NSHomeDirectory())//能看到手机根目录

            // 2.存储数据

            defaults.setObject("mj", forKey:"account")

            defaults.setObject("123", forKey:"pwd")

            defaults.setInteger(10, forKey:"age")

            defaults.setBool(true, forKey:"auto_login")

            

            // 3.立刻同步

            defaults.synchronize()

        }


        //读取

        @IBActionfunc read()

        {

            let defaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()

            let account = defaults.objectForKey("account")

            let autoLogin:Bool = defaults.boolForKey("auto_login")

            print("%@ -- %d", account, autoLogin)

            

        }

    • 注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入[defaults synchornize];

    3.NSKeyedArchiver归档(NSCoding)

    class MJStudent: NSObject,NSCoding

    {

        var no: NSString!

        var height: Double!

        var age: Int32!

        

        

        /**

         *  将某个对象写入文件时会调用

         *  在这个方法中说清楚哪些属性需要存储

         */

        func encodeWithCoder(aCoder: NSCoder)

        {

            print(NSHomeDirectory())

            aCoder.encodeObject(self.no, forKey: "no")

            aCoder.encodeInt(self.age, forKey: "age")

            aCoder.encodeDouble(self.height, forKey: "height")

        }

        

        

        /**

         *  从文件中解析对象时会调用

         *  在这个方法中说清楚哪些属性需要存储

         */

        required init?(coder aDecoder: NSCoder)

        {

            self.no = aDecoder.decodeObjectForKey("no") as! String

            self.age = aDecoder.decodeIntForKey("age")

            self.height = aDecoder.decodeDoubleForKey("height")

        }

        

    }




    class ViewController: UIViewController {

    //存储

        @IBAction func save()

        {

            //1.新的模型对象

            let stu: MJStudent = MJStudent(coder: aDecoder: NSCoder)

            stu.no = "42343254"

            stu.age = 20

            stu.height = 1.55

            

            // 2.归档模型对象

            // 2.1.获得Documents的全路径

            var doc: NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last

            // 2.2.获得文件的全路径

            var path: NSString = doc.stringByAppendingPathComponent("stu.data")

            // 2.3.将对象归档

            NSKeyedArchiver.archiveRootObject(stu, toFile: path as String)


        }


        //读取

        @IBAction func read()

        {

            // 1.获得Documents的全路径

             var doc: NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!

            // 2.获得文件的全路径

            var path: NSString = doc.stringByAppendingPathComponent("stu.data")

            

            // 3.从文件中读取MJStudent对象

            let stu: MJStudent = NSKeyedUnarchiver.unarchiveObjectWithFile(path)

            print("%@ %d %f", stu.no, stu.age, stu.height)

        }


    }


    展开全文
  • Swift写入沙盒中文件

    2019-06-11 11:26:15
    我想在沙盒中存储一下当前的版本号,做法是存到一个字典当中,然后用writeToFile,但是我写了如下的代码,始终提示不出来这个方法: 后来我这样写: so: maybe Dictionary is not equal to NSDictionary. ...

    我想在沙盒中存储一下当前的版本号,做法是存到一个字典当中,然后用writeToFile,但是我写了如下的代码,始终提示不出来这个方法:

    后来我这样写:

    so: maybe Dictionary is not equal to NSDictionary.

    转载于:https://juejin.im/post/5a376c496fb9a0452936dadb

    展开全文
  • Swift 文件读取 和 写入

    千次阅读 2018-01-31 09:24:45
    Swift 文件读取 和 写入1 文件的读取

    Swift 文件读取 和 写入

    1 文件的读取

    //加载本地字txt资源
    let path = Bundle.main.path(forResource:"mapStr", ofType:"txt")
    let text = try! String(contentsOfFile:path!, encoding: String.Encoding.utf8)
    

    2 文件的写入

    let msg = "需要写入的资源"
    let fileName = "学习笔记.text"
    
    let fileManager = FileManager.default
    let file = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first
    let path = file! + fileName
    
    fileManager.createFile(atPath: path, contents:nil, attributes:nil)
    
    let handle = FileHandle(forWritingAtPath:path)
    handle?.write(msg.data(using: String.Encoding.utf8)!)
    

    更新ing。。。

    展开全文
  • Swift 3.0 使用Core Data

    千次阅读 2017-07-23 11:07:22
    自iOS10 和swift3.0 之后,苹果的访问CoreData的方法发生了很大改变,简洁了许多,下面的内容是从0开始建立一个entity,并实现其存储和读取的功能。
  • swift plist写入和读取数据

    千次阅读 2018-08-23 19:54:38
    import UIKit //向指定的plist中写入数据--fileName: text.plist class ZQPredictProductIdSaveManager: NSObject { ... class func saveData(key: String, value: Any, fileName: String) -&gt; () { le...
  • Swift 读取本地txt文本数据及转换

    千次阅读 2019-03-28 10:26:06
    //读本地 转换成json do catch是抓错 let path = Bundle.main.url(forResource: "productDetailInfo", withExtension: "txt") let data = try! Data(contentsOf: path!) do { let dict = try!...
  • Swift 处理TCP粘包

    2020-03-29 19:43:56
    文章目录Swift 处理TCP粘包CocoaAsyncSocketSwift Data基础写入和读取替换处理TCP粘包释义解决方案实例协议头关于 Swift 处理TCP粘包 CocoaAsyncSocket 如果使用CocoaAsyncSocket来和服务器端进行TCP通信,那么它...
  • Swift 简单读写文件例

    万次阅读 2015-03-07 16:38:24
    //取得当前应用下路径 var sp = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentationDirectory, NSSearchPathDomainMask.AllDomainsMask, true) //循环出力取得路径 ...
  • 1. 获取二维数组要写入的文件路径:extension String{ func docConfigDir() -&gt; String { var path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, File...
  • 被我们广泛的使用,相比NSUUSERDEFAULT,它的实用性更加的广泛,但是属性列表还是有一些坑的,主要属性列表只能对NSDATA,NSDICITONARY,NSARRAY进行存储,但是对swift的数组,和字典和有一些局限,从而造成写入不...
  • let data = try? JSONSerialization.data(withJSONObject: array, options: .prettyPrinted) (data as NSData).write(toFile: "/Users/mac/Desktop/demo.json", atomically: true)从沙盒中读取json文件// 0. 获取...
  • ios应用开发中plist的读写(Swift)

    千次阅读 2015-11-17 23:58:40
    读取和存储数据是很多ios应用中常见的功能。有很多办法可以实现这个功能:NSUserDefaults、CoreData、使用plist等等。今天要介绍的是如何使用plist(使用swift语言)
  • Swift 写入Excel表格(libxlsxwriter)方式

    千次阅读 2018-09-30 09:34:10
    之前写过一种写入Excel表格的方式(https://blog.csdn.net/qin_shi/article/details/82772668 ),是通过LibXL库实现的,这个是官方的库,需要购买,否则生成的数据里会被追加脏数据。基于这种情况,另外找了一个库...
  • Swift 读写 plist 文件

    千次阅读 2018-07-26 22:13:14
    在MacOS项目中使用Swift管理plist,实现读写plist文件。 1. Jobs.swift 使用Jobs类管理Jobs.plist // Jobs.swift // Created by Cyril on 18/7/11. // Copyright © 2018年 GJ. All rights reserved. import ...
  • swift-知识

    2018-11-27 09:34:28
    //类似于oc宏定义 swift使用全局let来声明常量来取代 //声明仅调试的时候打印 func MyPrint&lt;N&gt;(message:N,fileName:String = #file,methodName:String = #function,lineNumber:Int = #line){ #if ...
  • JSONSerialization.data(withJSONObject: data as Any) as AnyObject! as! NSArray; }else{ //return "Error -> Data is nil!"; return try! JSONSerialization.data(withJSONObject: data as Any) as ...
  • 本文介绍Swift2.2 中, 创建文件/文件夹, 将NSObject对象存档到文件, 并从存档文件读取对象.1:可存档对象声明//必须要继承NSObject对象,并且实现NSCoding协议 class DataBean: NSObject, NSCoding { var image: ...
  • Swift调用OC之数据存储-NSData

    千次阅读 2015-03-11 20:23:50
    // Swift调用OC之数据存储NSData // // NSData的对象可以看做是缓冲区 // NSData是静态缓冲区(大小固定),NSMutableData是动态的 //  // 1.创建NSData // 2.访问数据(读取NSData) // 3.比较数据是否相同 //...
  • Swift将图片保存到沙盒下

    千次阅读 2017-04-05 11:54:47
    将图片保存到沙盒下,首先获取沙盒路径,追加图片名称,将图片转换成NSData类型,写到文件里。 persent参数:图片质量参数,该值越大,表示图片越清晰,图片文件也就越大//保存图片至沙盒 private func saveImage...
1 2 3 4 5 ... 20
收藏数 3,514
精华内容 1,405
热门标签
关键字:

data写入 swift