在本文中,我们将详细介绍Swift2的各个方面,并为您提供关于executeFetchRequest:错误处理的相关解答,同时,我们也将为您带来关于6.7Swift的do-try-catch错误处理模
在本文中,我们将详细介绍Swift 2的各个方面,并为您提供关于executeFetchRequest:错误处理的相关解答,同时,我们也将为您带来关于6.7 Swift的do-try-catch错误处理模式 [Swift原创教程]、android – Request.executeMeRequestAsync(session,Request.GraphUserCallback())函数的问题、core-data – 为什么executeFetchRequest在使用Swift在XCTest下运行时不返回子类对象?、execute executeQuery executeUpdate 三种的分别封装使用的有用知识。
本文目录一览:- Swift 2(executeFetchRequest):错误处理(swift error)
- 6.7 Swift的do-try-catch错误处理模式 [Swift原创教程]
- android – Request.executeMeRequestAsync(session,Request.GraphUserCallback())函数的问题
- core-data – 为什么executeFetchRequest在使用Swift在XCTest下运行时不返回子类对象?
- execute executeQuery executeUpdate 三种的分别封装使用
Swift 2(executeFetchRequest):错误处理(swift error)
我遇到了我不知道的代码问题。安装Xcode 7 Beta并将Swift代码转换为Swift 2之后
码:
override func viewDidAppear(animated: Bool) { let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate let context: NSManagedObjectContext = AppDel.managedObjectContext let request = NSFetchRequest(entityName: "PlayerList") list = Context.executeFetchRequest(request) tableView.reloadData()}
屏幕截图:
答案1
小编典典从Swift 2开始,将产生错误的Cocoa方法转换为引发错误的Swift函数。
而不是 Swift 1.x 中的可选返回值和错误参数:
var error : NSError?if let result = context.executeFetchRequest(request, error: &error) { // success ... list = result} else { // failure println("Fetch failed: \(error!.localizedDescription)")}
在 Swift 2中, 该方法现在返回非可选值,并在错误情况下引发错误,必须使用try-catch处理:
do { list = try context.executeFetchRequest(request) // success ...} catch let error as NSError { // failure print("Fetch failed: \(error.localizedDescription)")}
有关更多信息,请参见“ 将Swift与Cocoa和Objective-
C一起使用
”中的“采用Cocoa设计模式”
中的“错误处理”
。
6.7 Swift的do-try-catch错误处理模式 [Swift原创教程]
原文:http://coolketang.com/staticCoding/5a99261ed50eee2ea303773f.html
1. 本节课将为你解析异常捕捉语句,该语句主要用于对异常和错误进行监测和处理。同时通过一个食品出售的实例,演示异常捕捉语句的具体用法。
2. 首先定义一个Error类型的枚举。
3. 定义第一个枚举成员,表示没有指定的产品。
4. 定义第二个枚举成员,表示缺少钱币而无法购买产品,同时显示缺少金钱的数额。
5. 定义第三个枚举成员,表示货存不足。
6. 接着定义一个指定名称的结构体,表示用于销售的商品。
7. 给结构体添加两个属性,表示商品的价格和数量。
8. 定义一个变量,表示当前硬币的总数。
9. 定义一个类,表示售货商店。
10. 给类添加一个数组属性,表示该商店拥有的商品种类、价格和数量。
11. 添加一个名为销售的方法,用来模拟产品销售的动作。
12. 和if-let类似,都是根据其后的表达式的布尔值,决定下一步做什么。只是这样做更加简洁,可以避免过多的嵌套。
13. 通过抛出关键词,抛出异常,即提示错误的具体信息。当需要在函数或者方法里抛出异常,使用throw就可以了。
14. 判断当商品的价格大于当前硬币总数时,抛出硬币不足的异常。
15. 当以上异常均未发生时,即可正常进行交易。从硬币总数之中,减去需要购买的商品的价格。
16. 同时将商品的数量减1。
17. 然后同步更新产品数组中的,当前被购买的商品的属性信息。
18. 并在控制台输出当前的商品名称,作为购买的日志。
19. 现在我们可以模拟商品的销售操作了。首先创建一所商店。
20. 异常捕捉语句就是尝试做一件事情,如果失败则捕获出现的错误。这里首先尝试捕捉非法产品的错误。
21. 接着尝试捕捉产品库存不足的错误。
22. 最后捕捉硬币总数不够的错误。
23. 接着使用try语句,尝试购买指定名称的商品,然后点击显示调试区图标,打开控制台。
24. 在控制台可以看出,因为商店中没有销售指定的产品,所以输出了非法商品的错误信息。
25. 现在将购买的商品名称进行修改,此时在控制台输出了商品被购买的日志信息。点击垂直滚动条,查看上方的内容。
26. 从第45行右侧的结果可以看出,因为购买了一次布丁,所以当前的硬币总数为8。
27. 当再次购买布丁时,由于硬币总数8,小于布丁价格12,所以控制台输出了硬币不足的错误提示。最后再次点击此图标,关闭控制台,并结束本节课程。
28.
android – Request.executeMeRequestAsync(session,Request.GraphUserCallback())函数的问题
我对哈希键和所有内容都有很多问题,我认为我已经解决了所有这些问题,因为我的会话已经处于OPENED状态.
我现在遇到的问题是,在我登录facebook后,当会话已经打开时,代码执行Request.executeMeRquestAsync()并且它永远不会进入onComplete()部分……任何想法?
这是代码……
package com.example.firstandroidapp; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; import android.os.Bundle; import android.util.Base64; import android.util.Log; import android.widget.TextView; import com.facebook.Request; import com.facebook.Response; import com.facebook.Session; import com.facebook.SessionState; import com.facebook.model.GraphUser; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // start Facebook Login Session.openActiveSession(this,true,new Session.StatusCallback() { // callback when session changes state @Override public void call(Session session,SessionState state,Exception exception) { try { PackageInfo info = getPackageManager().getPackageInfo("com.example.firstandroidapp",PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.i("Digest: ",Base64.encodetoString(md.digest(),0)); } } catch (NameNotFoundException e) { Log.e("Test",e.getMessage()); } catch (NoSuchAlgorithmException e) { Log.e("Test",e.getMessage()); } if (session.isOpened()) { // make request to the /me API Request.executeMeRequestAsync(session,new Request.GraphUserCallback() { // callback after Graph API response with user object @Override public void onCompleted(GraphUser user,Response response) { // it never gets here... if (user != null) { TextView welcome = (TextView) findViewById(R.id.welcome); welcome.setText("Hello " + user.getName() + "!"); } } }); } } }); } @Override public void onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); Session.getActiveSession().onActivityResult(this,requestCode,data); } }
Thanx非常提前.
大卫.
解决方法
该教程告诉我们修改AndroidManifest.xml.在修改中,我将下面的标记放在错误的位置(我没有使用Eclipse来修改清单文件),这阻止了回调.
<manifest ...> ... <application ...> ... <activity android:name="com.facebook.LoginActivity"/> ... <Meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/> ... </application> ... <uses-permission android:name="android.permission.INTERNET"/> ... </manifest>
尝试仔细检查您的AndroidManifest.xml. The official document会有所帮助.
core-data – 为什么executeFetchRequest在使用Swift在XCTest下运行时不返回子类对象?
var entities = _managedContext.executeFetchRequest(fetchRequest,error: &error) as [MyEntity]?
以上结果导致:“致命错误:NSArray元素无法与控制台上的Swift数组元素类型匹配”.
var entities = _managedContext.executeFetchRequest(fetchRequest,error: &error) let e = entities[0] // Works fine let ee = e as NSManagedobject // Works fine let eee = e as MyEntity // Crash: Exception breakpoint,then ERR_BAD_ACCESS - no messages on console
以上结果导致崩溃,但仅在从单元测试中调用时!
我有两个目标,一个主目标和一个测试目标(正常的默认设置). NSManagedobject类被选择为在两个目标中,以便测试可以访问它们.这些子类是用Swift编写的,没有Objective-C.
在单元测试期间,我使用内存中的persistentStoreCoordinator(尽管我在AppDelegate中使用相同的一个设置尝试了相同的结果).
Swift的调试器几乎没用(抱歉不得不发泄).当我查看executeFetchRequest返回的数组的变量时,它不会展开以显示元素,并且任何“po”它或其内容的尝试都会彻底崩溃XCode – 加上SourceKit每隔3分钟崩溃就会产生一个非常大的问题.令人沮丧的一天…但我离题了.我可以发现的唯一有用的信息是返回的数组是TestTarget.MyEntity而不是MainTarget.MyEntity.我认为,在转换时,它正在尝试转换为MainTarget.MyEnity(因为测试中的代码驻留在MainTarget中),因此尝试崩溃.
能够对涉及Core Data的代码进行单元测试似乎是一件基本的事情,我无法相信这有多么令人沮丧.有没有人能够让XCTests与NSManagedobject子类一起使用?你如何让CoreData在MainTarget中返回正确的子类而不是TestTarget中的子类?
我尝试过的其他一些事情包括:
>将@objc(MyEntity)注释添加到子类中,但这会导致来自Core Data的有关未找到的类的消息,从而返回NSManagedobject实例(显然不能转换为子类)
>链接和提及的建议:How to unit-test NSFetchedResultsController in Swift
>建议:executeFetchRequest throw fatal error: NSArray element failed to match the Swift Array Element type
>敲打头撞墙,直到头晕.我建议不要采取这种措施,因此效率不高.
解决方法
execute executeQuery executeUpdate 三种的分别封装使用

package com.zhao.practice727_1;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* 测试类
* @author Administrator
*
*/
public class TestDBPreStat {
/**
* @param args
*/
public static void main(String[] args) {
new TestDBPreStat().testExecute();
}
/**
* 测试通过execute来查询数据
*/
public void testExecute(){
DBPreparedStatement db = new DBPreparedStatement();
String sql = "select name ,score from test2 where id = ?";
Object[] arrays = {10};
Object object = db.getDataByExecute(sql, arrays);
if(object instanceof List){
List list = (List)object;
for (Object obj : list) {
Map map = (Map)obj;
Iterator it = map.keySet().iterator();
while(it.hasNext()){
String key = (String) it.next();
String value = (String) map.get(key);
System.out.println(key +" "+value);
}
}
}
db.close();
}
// /**
// * 测试通过executeQuery或executeUpdate来查询数据
// */
// public void method1(){
// DBPreparedStatement db = new DBPreparedStatement();
// String sql = "select name ,score from test2 where id = ?";
// Object[] arrays = {10};
// List list = db.getDataBySQL(sql, arrays);
//
//
// for (Object object : list) {
// Map map = (Map)object;
// Iterator it = map.keySet().iterator();
// while(it.hasNext()){
// String key = (String) it.next();
// String value = (String) map.get(key);
// System.out.println(key +" "+value);
// }
//
// }
// db.close();
// }
}
package com.zhao.practice727_1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* PreparedStatement工具类
* @author Administrator
*
*/
public class DBPreparedStatement {
/**
* 驱动字符串
*/
private static final String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; // 加载JDBC驱动
/**
* 连接数据库的URL
*/
private static final String dbURL = "jdbc:sqlserver://localhost:1433; DatabaseName=Zhao722"; // 连接服务器和数据库Zhao722
/**
* 用户名字符串
*/
private static final String USER= "sa";
/**
* 密码字符串
*/
private static final String PASSWORD = "zhao";
/**
* 数据库连接
*/
Connection conn = null;
/**
* PreparedStatement
*/
PreparedStatement pstat = null;
/**
* 结果集ResultSet
*/
ResultSet rs = null;
static {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接
* @return
*/
private Connection getConnection(){
try {
conn = DriverManager.getConnection(dbURL, USER, PASSWORD);
// System.out.println(conn);
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 获得PreparedStatement对象
* @param sql sql语句
* @return PreparedStatement
*/
private PreparedStatement getPreparedStatement(String sql){
try {
pstat = getConnection().prepareStatement(sql);
System.out.println(sql);
return pstat;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 获得结果集
* @param arrays 传入的参数数组
* @param sql sql语句
* @return ResultSet
*/
private ResultSet getResultSet(String sql , Object[] arrays){
pstat = getPreparedStatement(sql);
try {
//设置参数
for (int i = 0; i < arrays.length; i++) {
pstat.setObject(i+1, arrays[i]);
}
//开始查询
rs = pstat.executeQuery();
return rs;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 增删改查的操作
* @param sql sql语句
* @param arrays 传入的参数数组
* @return int
*/
private int getDataByUpdate(String sql , Object[] arrays){
pstat = getPreparedStatement(sql);
try {
//设置参数
for (int i = 0; i < arrays.length; i++) {
pstat.setObject(i+1, arrays[i]);
}
//开始增删改查操作
int i = pstat.executeUpdate();
return i;
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
/**
* 对结果集进行处理
* @param sql sql语句
* @param arrays 传入的参数数组
* @return List
*/
private List getDataBySQL(String sql , Object[] arrays){
List list = new ArrayList();
try{
rs = getResultSet(sql, arrays);
//对结果集进行处理
while(rs.next()){
//定义Map来保存每行对应的每列的值
Map map = new HashMap();
//结果集元数据
ResultSetMetaData rsmd = rs.getMetaData();
for(int i= 1;i <= rsmd.getColumnCount();i++){
map.put(rsmd.getColumnName(i), rs.getObject(i));
}
//添加map到集合中
list.add(map);
}
return list;
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
/**
*执行execute语句
*/
public Object getDataByExecute(String sql , Object[] arrays){
int line = 0;
boolean hasResultSet = false;
pstat = getPreparedStatement(sql);
try {
//设置参数
for (int i = 0; i < arrays.length; i++) {
pstat.setObject(i+1, arrays[i]);
}
//开始查询
hasResultSet = pstat.execute();
if(hasResultSet){
return getDataBySQL(sql, arrays);
}else{
line = pstat.getUpdateCount();
return line;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭所有打开的数据库连接
*/
public void close(){
try{
if(rs != null){
rs.close();
}
if(pstat != null){
pstat.close();
}
if(conn != null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
关于Swift 2和executeFetchRequest:错误处理的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于6.7 Swift的do-try-catch错误处理模式 [Swift原创教程]、android – Request.executeMeRequestAsync(session,Request.GraphUserCallback())函数的问题、core-data – 为什么executeFetchRequest在使用Swift在XCTest下运行时不返回子类对象?、execute executeQuery executeUpdate 三种的分别封装使用等相关内容,可以在本站寻找。
本文标签: