全系列文章索引:
1 【CoreData】新建記錄
ios中的coredata的使用
http://blog.csdn.net/chen505358119/article/details/9334831
//插入數(shù)據(jù)??
-?(IBAction)addIntoDataSource:(id)sender?{??
? ? User*?user=(User?*)[NSEntityDescription?insertNewObjectForEntityForName:@"User"?inManagedObjectContext:self.myAppDelegate.managedObjectContext];??
? ? [user?setName:_nameText.text];??
? ? [user?setAge:[NSNumber?numberWithInteger:[_ageText.text?integerValue]]];??
? ? [user?setSex:_sexText.text];??
? ? NSError*?error;??
? ? BOOL?isSaveSuccess=[_myAppDelegate.managedObjectContext?save:&error];??
? ? if?(!isSaveSuccess)?{??
? ? ? ? NSLog(@"Error:%@",error);??
? ? }else{??
? ? ? ? NSLog(@"Save?successful!");??
? ? }??
}??
2 【CoreData】查詢記錄
//查詢??
-?(IBAction)query:(id)sender?{??
? ? NSFetchRequest*?request=[[NSFetchRequest?alloc]?init];??
? ? NSEntityDescription*?user=[NSEntityDescription?entityForName:@"User"?inManagedObjectContext:_myAppDelegate.managedObjectContext];??
? ? [request?setEntity:user];??
//????NSSortDescriptor*?sortDescriptor=[[NSSortDescriptor?alloc]?initWithKey:@"name"?ascending:YES];??
//????NSArray*?sortDescriptions=[[NSArray?alloc]?initWithObjects:sortDescriptor,?nil];??
//????[request?setSortDescriptors:sortDescriptions];??
//????[sortDescriptions?release];??
//????[sortDescriptor?release];??
? ? NSError*?error=nil;??
? ? NSMutableArray*?mutableFetchResult =[[_myAppDelegate.managedObjectContext? executeFetchRequest:request?error:&error]?mutableCopy];??
? ? if?(mutableFetchResult==nil)?{??
? ? ? ? NSLog(@"Error:%@",error);??
? ? }??
? ? NSLog(@"The?count?of?entry:?%i",[mutableFetchResult?count]);??
? ? for?(User*?user?in?mutableFetchResult)?{??
? ? ? ? NSLog(@"name:%@----age:%@------sex:%@",user.name,user.age,user.sex);??
? ? }??
? ? [mutableFetchResult?release];??
? ? [request?release];??
}??
3 【CoreData】更新記錄
//更新??
-?(IBAction)update:(id)sender?{??
? ? NSFetchRequest*?request=[[NSFetchRequest?alloc]?init];??
? ? NSEntityDescription*?user=[NSEntityDescription?entityForName:@"User"?inManagedObjectContext:_myAppDelegate.managedObjectContext];??
? ? [request?setEntity:user];??
? ? //查詢條件??
? ? NSPredicate*?predicate=[NSPredicate?predicateWithFormat:@"name==%@",@"chen"];??
? ? [request?setPredicate:predicate];??
? ? NSError*?error=nil;??
? ? NSMutableArray*?mutableFetchResult=[[_myAppDelegate.managedObjectContext?executeFetchRequest:request?error:&error]?mutableCopy];??
? ? if?(mutableFetchResult==nil)?{??
? ? ? ?NSLog(@"Error:%@",error);??
? ? }??
? ? NSLog(@"The?count?of?entry:?%i",[mutableFetchResult?count]);??
? ? //更新age后要進(jìn)行保存,否則沒(méi)更新??
? ? for?(User*?user?in?mutableFetchResult)?{??
? ? ? ? [user?setAge:[NSNumber?numberWithInt:12]];? ? ? ? ? ?
? ? }??
? ? [_myAppDelegate.managedObjectContext?save:&error];??
? ? [mutableFetchResult?release];??
? ? [request?release];? ? ? ?
}??
4 【CoreData】刪除記錄
//刪除??
-?(IBAction)del:(id)sender?{??
? ? NSFetchRequest*?request=[[NSFetchRequest?alloc]?init];??
? ? NSEntityDescription*?user=[NSEntityDescription?entityForName:@"User"?inManagedObjectContext:_myAppDelegate.managedObjectContext];??
? ? [request?setEntity:user];??
? ? NSPredicate*?predicate=[NSPredicate?predicateWithFormat:@"name==%@",@"chen"];??
? ? [request?setPredicate:predicate];??
? ? NSError*?error=nil;??
? ? NSMutableArray*?mutableFetchResult=[[_myAppDelegate.managedObjectContext?executeFetchRequest:request?error:&error]?mutableCopy];??
? ? if?(mutableFetchResult==nil)?{??
? ? ? ? NSLog(@"Error:%@",error);??
? ? }??
? ? NSLog(@"The?count?of?entry:?%i",[mutableFetchResult?count]);??
? ? for?(User*?user?in?mutableFetchResult)?{??
? ? ? ? [_myAppDelegate.managedObjectContext?deleteObject:user];??
? ? }? ? ?
? ? if?([_myAppDelegate.managedObjectContext?save:&error])?{??
? ? ? ? NSLog(@"Error:%@,%@",error,[error?userInfo]);??
? ? }??
}??
5? 【CoreData】多條件查詢
predicate = [NSPredicate
predicateWithFormat:@"(salesMan = %@) AND (customerName contains %@) AND
(customerSex = %@) AND (createdDate >= %d) AND (createdDate <=
%d)",[[NSUserDefaults standardUserDefaults]
objectForKey:kDefaultUsernameKey], custName,custSex, fromTime, toTime];
6? 【CoreData】處理海量數(shù)據(jù)
????????Batch Updates可用于批量快速更新數(shù)據(jù)砚哆,Asynchronous Fetching可用于異步抓取海量數(shù)據(jù),并可以通過(guò)?NSProgress?實(shí)現(xiàn)進(jìn)度跟蹤和取消。
6.1 Batch Updates
????????在CoreData中想要更新大量數(shù)據(jù)岁钓,我們往往要將大量修改后的NSManagedObject?加載到?NSManagedObjectContext?中并保存蛤迎,這會(huì)占用大量?jī)?nèi)存键痛,試想想在iPhone這樣的內(nèi)存有限的移動(dòng)設(shè)備上將是個(gè)災(zāi)難,數(shù)據(jù)有可能丟失对途。你可能會(huì)采取批處理的方式,即一小批一小批的更新?NSManagedObject?并保存到?NSManagedObjectContext?中髓棋,但這樣會(huì)花費(fèi)很多時(shí)間实檀,用戶體驗(yàn)較差。
????????為了解決這個(gè)問(wèn)題按声,蘋(píng)果在?NSManagedObjectContext?加入了一個(gè)新的方法:executeRequest:error:?膳犹,它接受一個(gè)?NSPersistentStoreRequest?類(lèi)型的參數(shù),返回類(lèi)型為?NSPersistentStoreResult?签则。
????????關(guān)于?NSPersistentStoreRequest?有些人可能比較熟悉须床,它是NSFetchRequest?、?NSSaveChangesRequest?渐裂、?NSBatchUpdateRequest和?NSAsynchronousFetchRequest?的基類(lèi)豺旬。后兩個(gè)類(lèi)是這次iOS8新加的,也是這篇文章將要討論的內(nèi)容芯义。
????????NSPersistentStoreResult?是一個(gè)新加入的類(lèi)哈垢,它也是一個(gè)基類(lèi),而且是抽象類(lèi)扛拨,這個(gè)類(lèi)作為?executeRequest:error:?返回內(nèi)容的父類(lèi)耘分,相當(dāng)于一個(gè)接口,它目前有兩個(gè)子類(lèi):?NSPersistentStoreAsynchronousResult?和NSBatchUpdateResult?。
????????你大概猜到了求泰,?NSBatchUpdateResult?對(duì)應(yīng)著前面的NSBatchUpdateRequest?央渣,下面說(shuō)說(shuō)?NSBatchUpdateRequest?。它有點(diǎn)像NSFetchRequest?:它允許你指定一個(gè)想要更新數(shù)據(jù)的實(shí)體渴频;也可以指定一個(gè)affectedStores?芽丹,它存儲(chǔ)了一個(gè)接受更新請(qǐng)求的?NSPersistentStore?數(shù)組。(其實(shí)它是?NSPersistentStoreRequest?的屬性)卜朗;它也有一個(gè)謂詞屬性來(lái)做更新的條件拔第,它跟?NSFetchRequest?中的謂詞一樣強(qiáng)大和靈活,類(lèi)似于SQL的where語(yǔ)句场钉;它允許你指定想要更新的字段蚊俺,通過(guò)?propertiesToUpdate?屬性來(lái)描述字段更新,它是一個(gè)字段逛万,key為?NSPropertyDescription?或?qū)傩悦址锯瑅alue為?NSExpression?或常量。
????????接著談?wù)?NSBatchUpdateResult?宇植,它有一個(gè)?result?屬性和?resultType屬性得封,?result?中的內(nèi)容跟?resultType?有關(guān),可能是成功或者失敗指郁,有可能是每行被更新的ID忙上,也可能是被更新的行數(shù)。
????????需要注意的是坡氯,由于?NSBatchUpdateRequest?并不會(huì)先將數(shù)據(jù)存入內(nèi)存晨横,而是直接操作數(shù)據(jù)庫(kù),所以并不會(huì)引起NSManagedObjectContext的同步更新箫柳,所以你不僅需要獲取?NSBatchUpdateResult?然后刷新?NSManagedObjectContext?對(duì)應(yīng)的數(shù)據(jù)和UI界面手形,還需要保證更新后的數(shù)據(jù)滿足數(shù)據(jù)庫(kù)模型上的?validation?,因?yàn)?NSManagedObjectContext?沒(méi)有感知Batch Updates悯恍,一些數(shù)據(jù)驗(yàn)證工作就落在了程序員的身上(你需要寫(xiě)一段代碼驗(yàn)證更新后的數(shù)據(jù)是合法的库糠,用戶可不希望在跑步APP上看到自己今天跑步里程是個(gè)負(fù)數(shù))。一旦有非法數(shù)據(jù)錄入數(shù)據(jù)庫(kù)涮毫,下次加載并修改?NSManagedObject?的時(shí)候就會(huì)導(dǎo)致數(shù)據(jù)驗(yàn)證失敗瞬欧。除了上面提到的這些,還要注意Batch Updates對(duì)數(shù)據(jù)庫(kù)的操作是樂(lè)觀鎖罢防,也就是假定很少會(huì)發(fā)生同時(shí)存取同一塊數(shù)據(jù)的情況艘虎,所以你需要制定一個(gè)合理的”merge”策略來(lái)應(yīng)付因同時(shí)更新數(shù)據(jù)產(chǎn)生的沖突。
????????Batch Updates的優(yōu)勢(shì)在于其效率咒吐,在處理上萬(wàn)條數(shù)據(jù)的時(shí)候野建,它執(zhí)行的時(shí)間跟SQL語(yǔ)句執(zhí)行時(shí)間相當(dāng)属划。
6.2 Asynchronous Fetching
????????Asynchronous Fetching的加入依然是為了解決CoreData讀取海量數(shù)據(jù)所帶來(lái)的問(wèn)題。通過(guò)使用Asynchronous Fetching候生,我們可以在抓取數(shù)據(jù)的同時(shí)不阻塞占用NSManagedObjectContext?同眯,并可以隨時(shí)取消抓取行為,隨時(shí)跟蹤抓取數(shù)據(jù)的進(jìn)度唯鸭。
????????設(shè)想我們平時(shí)用?NSFetchRequest?抓取數(shù)據(jù)的時(shí)候须蜗,我們會(huì)先用NSManagedObjectContext?的?executeFetchRequest:error:?方法傳入一個(gè)NSFetchRequest?,然后請(qǐng)求會(huì)被發(fā)送到?NSPersistentStore?目溉,然后執(zhí)行一段時(shí)間后返回一個(gè)數(shù)組明肮,在?NSManagedObjectContext?更新后,這個(gè)數(shù)組被當(dāng)做executeFetchRequest:error:?的返回值返回到我們這里停做。
而Asynchronous Fetching則不同晤愧,當(dāng)我們將一個(gè)NSAsynchronousFetchRequest?對(duì)象傳入?executeRequest:error:?方法后會(huì)立即返回一個(gè)“未來(lái)的”?NSAsynchronousFetchResult?大莫。NSAsynchronousFetchRequest?初始化時(shí)需要傳入兩個(gè)參數(shù)賦值給屬性:
????1.? ?completionBlock?屬性蛉腌,允許我們?cè)谧ト⊥瓿珊髨?zhí)行回調(diào)block;
????2.? fetchRequest?屬性只厘,類(lèi)型是?NSFetchRequest?烙丛。也即是說(shuō)雖然是異步抓取,其實(shí)我們用的還是以前的?NSFetchRequest?羔味,當(dāng)?NSFetchRequest?抓取結(jié)束后會(huì)更新?NSManagedObjectContext?河咽,這也就意味著NSManagedObjectContext?的并發(fā)類(lèi)型只能是NSPrivateQueueConcurrencyType? 或?NSMainQueueConcurrencyType。
????????于是當(dāng)我們用?NSAsynchronousFetchRequest?抓取數(shù)據(jù)時(shí)赋元,我們會(huì)先用NSManagedObjectContext?的?executeRequest:error:?方法傳入一個(gè)NSAsynchronousFetchRequest?忘蟹,這個(gè)方法在?NSManagedObjectContext?上執(zhí)行時(shí),?NSManagedObjectContext?會(huì)立即制造并返回一個(gè)NSAsynchronousFetchResult?搁凸,同時(shí)?NSAsynchronousFetchRequest?會(huì)被發(fā)送到?NSPersistentStore?媚值。你現(xiàn)在可以繼續(xù)編輯這個(gè)NSManagedObjectContext?中的?NSManagedObject?,等到NSPersistentStore?執(zhí)行請(qǐng)求完畢時(shí)會(huì)將結(jié)果返回給NSAsynchronousFetchResult?的?finalResult?屬性护糖,更新NSManagedObjectContext?褥芒,執(zhí)行?NSAsynchronousFetchRequest?的回調(diào)block。
????????舉個(gè)栗子:
let request = NSFetchRequest(entityName: "MyEntity")?????????
let?async = NSAsynchronousFetchRequest(fetchRequest: request){?????????????
????(id result)in?????????????
? ??if?result.finalResult {????????????????
????????? //TODO..????????????
?????}?????????
}
????????Swift代碼很簡(jiǎn)潔嫡良,并用了尾隨閉包語(yǔ)法锰扶,看不懂的朋友也不用著急,知道NSAsynchronousFetchRequest?大概的用法就行寝受。
????????之前提到過(guò)?NSAsynchronousFetchRequest?能在抓取數(shù)據(jù)的過(guò)程中跟蹤進(jìn)度坷牛,于是乎?NSProgress?登場(chǎng)了!一行代碼頂十句話:
let request = NSFetchRequest(entityName: "MyEntity")?
var asyncResult:NSPersistentStoreResult!?
let?async = NSAsynchronousFetchRequest(fetchRequest: request){?????????????
????(id result)in?????????????
? ??if?result.finalResult {?????????????????
? ??????//TODO..?????????????
????}?????????
}
let progress = NSProgress(totalUnitCount: 1) progress.becomeCurrentWithPendingUnitCount(1) managedObjectContext?.performBlock{?????????????
????[unowned self]in?????????????
? ??let?error = NSErrorPointer()?????????????
????asyncResult = self.managedObjectContext?.executeRequest(async, error: error)?????????
}?
progress.resignCurrent()
????????而取消獲取數(shù)據(jù)只需要取消?NSProgress?就可以了很澄!取消行為會(huì)沿著數(shù)的根節(jié)點(diǎn)蔓延到葉子京闰。
progress.cancel()可以在?cancellationHandler?屬性設(shè)置取消后執(zhí)行的block锨亏,這里不再多說(shuō)。
7 【NSSet】NSArray NSSet轉(zhuǎn)換
NSArray?*arr?=?@[@"12-11",?@"12-11",?@"12-11",?@"12-12",?@"12-13",?@"12-14"];??
NSSet?*set?=?[NSSet?setWithArray:arr];??
NSLog(@"set%@\n",?set);??
8 【NSSet】NSSet的排序
NSArray?*arr?=?@[@"12-11",?@"12-11",?@"12-11",?@"12-12",?@"12-13",?@"12-14"];??
NSSet?*set?=?[NSSet?setWithArray:arr];??
NSArray?*sortDesc?=?@[[[NSSortDescriptor?alloc]?initWithKey:nil?ascending:YES]];??
NSArray?*sortSetArray?=?[set?sortedArrayUsingDescriptors:sortDesc];??
NSLog(@"set%@\nsort?set%@",?set,?sortSetArray);?
9 【JS】位運(yùn)算的運(yùn)算符優(yōu)先級(jí)問(wèn)題
????????在Javascript中忙干,位運(yùn)算的運(yùn)算符優(yōu)先級(jí)比加減號(hào)低器予,所以一定要注意,正確的寫(xiě)法是在位運(yùn)算符處加上括號(hào):
_deviceStatusData.outflowTDS.value= (body[43] << 8) + body[42];
10 【JS】Js獲取當(dāng)前日期時(shí)間及其它操作
varmyDate = new Date();
myDate.getYear();????????//獲取當(dāng)前年份(2位)
myDate.getFullYear();????//獲取完整的年份(4位,1970-????)
myDate.getMonth();???????//獲取當(dāng)前月份(0-11,0代表1月)
myDate.getDate();????????//獲取當(dāng)前日(1-31)
myDate.getDay();?????????//獲取當(dāng)前星期X(0-6,0代表星期天)
myDate.getTime();????????//獲取當(dāng)前時(shí)間(從1970.1.1開(kāi)始的毫秒數(shù))
myDate.getHours();???????//獲取當(dāng)前小時(shí)數(shù)(0-23)
myDate.getMinutes();?????//獲取當(dāng)前分鐘數(shù)(0-59)
myDate.getSeconds();?????//獲取當(dāng)前秒數(shù)(0-59)
myDate.getMilliseconds();????//獲取當(dāng)前毫秒數(shù)(0-999)
myDate.toLocaleDateString();?????//獲取當(dāng)前日期
var mytime=myDate.toLocaleTimeString();?????//獲取當(dāng)前時(shí)間
myDate.toLocaleString( );????????//獲取日期與時(shí)間
日期時(shí)間腳本庫(kù)方法列表
Date.prototype.isLeapYear判斷閏年
Date.prototype.Format
日期格式化
Date.prototype.DateAdd
日期計(jì)算
Date.prototype.DateDiff
比較日期差
Date.prototype.toString
日期轉(zhuǎn)字符串
Date.prototype.toArray
日期分割為數(shù)組
Date.prototype.DatePart
取日期的部分信息
Date.prototype.MaxDayOfDate
取日期所在月的最大天數(shù)
Date.prototype.WeekNumOfYear
判斷日期所在年的第幾周
StringToDate
字符串轉(zhuǎn)日期型
IsValidDate
驗(yàn)證日期有效性
CheckDateTime
完整日期時(shí)間檢查
daysBetween
日期天數(shù)差
js代碼:
//判斷閏年
Date.prototype.isLeapYear = function()
{
return(0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0)));
}
//---------------------------------------------------
//日期格式化
//格式 YYYY/yyyy/YY/yy 表示年份
// MM/M月份
// W/w星期
// dd/DD/d/D日期
// hh/HH/h/H時(shí)間
// mm/m分鐘
// ss/SS/s/S秒
//---------------------------------------------------
Date.prototype.Format = function(formatStr)
{
????var str = formatStr;
????var Week = ['日','一','二','三','四','五','六'];
????str=str.replace(/yyyy|YYYY/,this.getFullYear());
????str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear()% 100).toString():'0' + (this.getYear() % 100));
????str=str.replace(/MM/,this.getMonth()>9?this.getMonth().toString():'0'+ this.getMonth());
????str=str.replace(/M/g,this.getMonth());
????str=str.replace(/w|W/g,Week[this.getDay()]);
????str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0'+ this.getDate());
????str=str.replace(/d|D/g,this.getDate());
????str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0'+ this.getHours());
????str=str.replace(/h|H/g,this.getHours());
????str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0'+ this.getMinutes());
????str=str.replace(/m/g,this.getMinutes());
????str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0'+ this.getSeconds());
????str=str.replace(/s|S/g,this.getSeconds());
????return str;
}
//---------------------------------------------------
//求兩個(gè)時(shí)間的天數(shù)差 日期格式為YYYY-MM-dd
//---------------------------------------------------
function daysBetween(DateOne,DateTwo)
{
????var OneMonth = DateOne.substring(5,DateOne.lastIndexOf('-'));
????var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ('-')+1);
????var OneYear = DateOne.substring(0,DateOne.indexOf('-'));
????var TwoMonth = DateTwo.substring(5,DateTwo.lastIndexOf('-'));
????var TwoDay =DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf ('-')+1);
????var TwoYear = DateTwo.substring(0,DateTwo.indexOf('-'));
????var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)-Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000);
????return Math.abs(cha);
}
//---------------------------------------------------
//日期計(jì)算
//---------------------------------------------------
Date.prototype.DateAdd = function(strInterval, Number) {
????var dtTmp = this;
????switch (strInterval) {
????????case 's' :return newDate(Date.parse(dtTmp) + (1000 * Number));
????????case 'n' :return newDate(Date.parse(dtTmp) + (60000 * Number));
????????case 'h' :return newDate(Date.parse(dtTmp) + (3600000 * Number));
????????case 'd' :return newDate(Date.parse(dtTmp) + (86400000 * Number));
????????case 'w' :return newDate(Date.parse(dtTmp) + ((86400000 * 7) * Number));
????????case 'q' :return newDate(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number*3, dtTmp.getDate(),dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
????????case 'm' :return newDate(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(),dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
????????case 'y' :return newDate((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(),dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
????}
}
//---------------------------------------------------
//比較日期差 dtEnd 格式為日期型或者有效日期格式字符串
//---------------------------------------------------
Date.prototype.DateDiff = function(strInterval, dtEnd) {
????var dtStart = this;
????if (typeof dtEnd == 'string' )????//如果是字符串轉(zhuǎn)換為日期型
????{
????????dtEnd =StringToDate(dtEnd);
????}
????switch (strInterval) {
????????case 's' :returnparseInt((dtEnd - dtStart) / 1000);
????????case 'n' :returnparseInt((dtEnd - dtStart) / 60000);
????????case 'h' :returnparseInt((dtEnd - dtStart) / 3600000);
????????case 'd' :returnparseInt((dtEnd - dtStart) / 86400000);
????????case 'w' :returnparseInt((dtEnd - dtStart) / (86400000 * 7));
????????case 'm' :return(dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) -(dtStart.getMonth()+1);
????????case 'y' :returndtEnd.getFullYear() - dtStart.getFullYear();
????}
}
//---------------------------------------------------
//日期輸出字符串捐迫,重載了系統(tǒng)的toString方法
//---------------------------------------------------
Date.prototype.toString = function(showWeek)
{
????var myDate= this;
????var str = myDate.toLocaleDateString();
????if (showWeek)
????{
????????var Week = ['日','一','二','三','四','五','六'];
????????str += '星期' + Week[myDate.getDay()];
????}
????return str;
}
//---------------------------------------------------
//日期合法性驗(yàn)證
//格式為:YYYY-MM-DD或YYYY/MM/DD
//---------------------------------------------------
function IsValidDate(DateStr)
{
????var sDate=DateStr.replace(/(^\s+|\s+$)/g,''); //去兩邊空格;
????if(sDate=='') return true;
????//如果格式滿足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替換為''
????//數(shù)據(jù)庫(kù)中乾翔,合法日期可以是:YYYY-MM/DD(2003-3/21),數(shù)據(jù)庫(kù)會(huì)自動(dòng)轉(zhuǎn)換為YYYY-MM-DD格式
????var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2}[\-/]{ 1 }[\d]{ 1,2 }/g,'');
????if (s=='') //說(shuō)明格式滿足YYYY-MM-DD或YYYY-M-DD或YYYY-M-D或YYYY-MM-D
????{
????????var t=newDate(sDate.replace(/\-/g,'/'));
????????var ar = sDate.split(/[-/:]/);
????????if(ar[0] != t.getYear() ||ar[1] != t.getMonth()+1 || ar[2] != t.getDate())
????????{
????????????//alert('錯(cuò)誤的日期格式!格式為:YYYY-MM-DD或YYYY/MM/DD施戴。注意閏年反浓。');
????????????return false;
????????}
????}
????else
????{
????????//alert('錯(cuò)誤的日期格式!格式為:YYYY-MM-DD或YYYY/MM/DD赞哗。注意閏年雷则。');
????????return false;
????}
????return true;
}
//---------------------------------------------------
//日期時(shí)間檢查
//格式為:YYYY-MM-DD HH:MM:SS
//---------------------------------------------------
function CheckDateTime(str)
{
? ? var reg = /^(\d+)-(\d{ 1,2 })-(\d{ 1,2 }) (\d{ 1,2}):(\d{ 1,2 }):(\d{ 1,2 })$/;
????var r = str.match(reg);
????if(r==null)return false;
????r[2]=r[2]-1;
????var d= new Date(r[1],r[2],r[3],r[4],r[5],r[6]);
????if(d.getFullYear()!=r[1]) return false;
????if(d.getMonth()!=r[2]) return false;
????if(d.getDate()!=r[3]) return false;
????if(d.getHours()!=r[4]) return false;
????if(d.getMinutes()!=r[5]) return false;
????if(d.getSeconds()!=r[6]) return false;
????return true;
}
//---------------------------------------------------
//把日期分割成數(shù)組
//---------------------------------------------------
Date.prototype.toArray = function()
{
????var myDate = this;
????var myArray = Array();
????myArray[0] = myDate.getFullYear();
????myArray[1] = myDate.getMonth();????
????myArray[2] = myDate.getDate();
????myArray[3] = myDate.getHours();
????myArray[4] = myDate.getMinutes();
????myArray[5] = myDate.getSeconds();
????return myArray;
}
//---------------------------------------------------
//取得日期數(shù)據(jù)信息
//參數(shù) interval 表示數(shù)據(jù)類(lèi)型
// y年 m月 d日 w星期 ww周 h時(shí) n分 s秒
//---------------------------------------------------
Date.prototype.DatePart = function(interval)
{
????var myDate = this;
????var partStr='';
????var Week = ['日','一','二','三','四','五','六'];
????switch (interval)
????{
????????case 'y' :partStr =myDate.getFullYear();break;
????????case 'm' :partStr =myDate.getMonth()+1;break;????
????????case 'd' :partStr =myDate.getDate();break;
????????case 'w' :partStr =Week[myDate.getDay()];break;
????????case 'ww' :partStr =myDate.WeekNumOfYear();break;
????????case 'h' :partStr =myDate.getHours();break;
????????case 'n' :partStr =myDate.getMinutes();break;
????????case 's' :partStr =myDate.getSeconds();break;
????}
????return partStr;
}
//---------------------------------------------------
//取得當(dāng)前日期所在月的最大天數(shù)
//---------------------------------------------------
Date.prototype.MaxDayOfDate = function()
{
????var myDate = this;
????var ary = myDate.toArray();
????var date1 = (new Date(ary[0],ary[1]+1,1));
????var date2 = date1.dateAdd(1,'m',1);
????var result = dateDiff(date1.Format('yyyy-MM-dd'),date2.Format('yyyy-MM-dd'));
????return result;
}
//---------------------------------------------------
//取得當(dāng)前日期所在周是一年中的第幾周
//---------------------------------------------------
Date.prototype.WeekNumOfYear = function()
{
????var myDate = this;
????var ary = myDate.toArray();
????var year = ary[0];
????var month = ary[1]+1;
????var day = ary[2];
????document.write('< script language=VBScript\>\n');
????document.write('myDate =Datue(''+month+'-'+day+'-'+year+'') \n');
????document.write('result = DatePart('ww', myDate)\n');
????document.write(' \n');
????return result;
}
//---------------------------------------------------
//字符串轉(zhuǎn)成日期類(lèi)型
//格式MM/dd/YYYY MM-dd-YYYY YYYY/MM/ddYYYY-MM-dd
//---------------------------------------------------
function StringToDate(DateStr)
{
????var converted = Date.parse(DateStr);
????var myDate = new Date(converted);
????if (isNaN(myDate))
????{
????????//var delimCahar =DateStr.indexOf('/')!=-1?'/':'-';
????????var arys=DateStr.split('-');
????????myDate = newDate(arys[0],--arys[1],arys[2]);
????}
????return myDate;
}
//若要顯示:當(dāng)前日期加時(shí)間(如:2009-06-1212:00)
function CurentTime()
{
????var now = new Date();
????var year =now.getFullYear();???????//年
????var month = now.getMonth() +1;?????//月
????var day =now.getDate();????????????//日
????var hh =now.getHours();????????????//時(shí)
????var mm =now.getMinutes();??????????//分
????var clock = year +"-";
????if(month < 10)
????????clock+= "0";
????clock += month + "-";
????if(day < 10)
????????clock+= "0";
????clock += day + " ";
????if(hh < 10)
????????clock+= "0";
????clock += hh + ":";
????if (mm < 10) clock +='0';
????clock += mm;
????return(clock);
}
11 【File】iOS的四種方法讀取文件內(nèi)容
//第一種方法: NSFileManager實(shí)例方法讀取數(shù)據(jù)
NSArray*paths =? NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
NSString*thepath = [paths lastObject];
?thepath = [thepath stringByAppendingPathComponent:@"fd_list.txt"];
NSLog(@"桌面目錄:%@", thepath);
NSFileManager*fm = [NSFileManager defaultManager];
NSData*data = [[NSData alloc] init];
data = [fm contentsAtPath:thepath];
?NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//第二種方法: NSData類(lèi)方法讀取數(shù)據(jù)
data = [NSData dataWithContentsOfFile:thepath];
NSLog(@"NSData類(lèi)方法讀取的內(nèi)容是:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//第三種方法: NSString類(lèi)方法讀取內(nèi)容
NSString*content = [NSString stringWithContentsOfFile:thepath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"NSString類(lèi)方法讀取的內(nèi)容是:\n%@",content);
//第四種方法: NSFileHandle實(shí)例方法讀取內(nèi)容
NSFileHandle* fh = [NSFileHandle fileHandleForReadingAtPath:thepath];
data = [fh readDataToEndOfFile];
NSLog(@"NSFileHandle實(shí)例讀取的內(nèi)容是:\n%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
http://www.2cto.com/kf/201404/290149.html
12 【編譯】Cannot define category for undefined class ‘NSString’
這個(gè)問(wèn)題是由于默認(rèn)沒(méi)有引用Foundation.h導(dǎo)致
解決方案:
?????? 在代碼中引用#import
13 【View】-[UITableViewController loadView] loaded the"XXX" nib but didn't get a UITableView.
'-[UITableViewController loadView] loaded the"XXX" nib but didn't get a UITableView.'
????解決方法:在頭文件中,將所繼承的父類(lèi)UITableViewController 改成 UIViewController肪笋。
uncaught exception 'NSInternalInconsistencyException,reason:[UITableViewController loadView] loaded the "Controller" nibbut didn't get a UITableView
http://www.tuicool.com/articles/67VN3m
14 【Network】使用AFNetworking2.0請(qǐng)求數(shù)據(jù)時(shí)出現(xiàn)錯(cuò)誤Requestfailed:unacceptablecontent-type:text/html解決方法
????????使用AFNetworking 2.0請(qǐng)求數(shù)據(jù)時(shí)出現(xiàn)錯(cuò)誤 Request failed: unacceptable content-type: text/html ????????解決方法:
????????添加一行
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
http://www.haogongju.net/art/2407859
15 【JS】Js常用調(diào)試的方法
http://www.cnblogs.com/Look_Sun/archive/2010/08/06/1793643.html
16 【JS】Safari調(diào)試工具
????????在Enable - SafariPrefernces --> Advanced最下面的選項(xiàng)勾選月劈, 然后你就可以在右鍵菜單上看到Inspect Element選項(xiàng)了 - 跟Chrome一模一樣
17 【地理位置】APP獲取本地地理位置時(shí)注意
????????APP中獲取本地地理位置時(shí),要注意打開(kāi)APP的地理位置授權(quán)藤乙,位置在設(shè)置—>隱私—>定位服務(wù)
?????? 不然獲取不到位置信息猜揪,而且沒(méi)有提示,而且APP一旦移除重新安裝坛梁,需要重新設(shè)置而姐。
18 【mac ox】mac命令行下怎么切換到root用戶
????????可以使用sudo -i然后輸入密碼即可
19 【js】遍歷js對(duì)象并獲取某一個(gè)成員對(duì)象
for(var app in callbackData)
{
????var appObj = callbackData[app];
?????if(appObj != null && appObj.applianceId != undefined &&appObj.applianceId == curAppID)
?????{
? ? ? ? ? ?_userApplianceInfo = appObj;
? ? ? ? ? ?break;
? ? ? ?}
?}
20 Objective-C自定義NSLog宏
/*
?XCode?LLVM?XXX?-?Preprocessing中Debug會(huì)添加?DEBUG=1?標(biāo)志
?*/
#ifdef?DEBUG
#define?NSLog(FORMAT,?...)?fprintf(stderr,"%s:%d\t%s\n",[[[NSString?stringWithUTF8String:__FILE__]?lastPathComponent]?UTF8String],?__LINE__,?[[NSString?stringWithFormat:FORMAT,?##__VA_ARGS__]?UTF8String]);
#else
#define?NSLog(FORMAT,?...)?nil
#endif
21 【兼容性】IOS8中,CLLocationManagerDelegate不調(diào)用didUpdateLocations
CLLocationManagerDelegate不調(diào)用didUpdateLocations
http://www.cocoachina.com/bbs/read.php?tid=259171
iOS8下的開(kāi)發(fā)變化
http://www.cocoachina.com/bbs/read.php?tid=217107
????????需要在使用CoreLocation前調(diào)用方法 requestWhenInUseAuthorization()或者requestAlwaysAuthorization()划咐,并在Info.plist中加入兩個(gè)缺省沒(méi)有的字段NSLocationAlwaysUsageDescription拴念、NSLocationWhenInUseUsageDescription?