GVKun编程网logo

Swift 2(executeFetchRequest):错误处理(swift error)

12

在本文中,我们将详细介绍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)

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原创教程]

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.
本文整理自:《Swift4互动教程》,真正的 [手把手]教学模式,用最快的速度上手iOS开发和Swift语言,苹果商店App Store免费下载: https://itunes.apple.com/cn/app/id1320746678 ,或扫描本页底部的二维码。课程配套素材下载地址: 资料下载

android – Request.executeMeRequestAsync(session,Request.GraphUserCallback())函数的问题

android – Request.executeMeRequestAsync(session,Request.GraphUserCallback())函数的问题

我正在使用Facebook关注 Android应用程序登录教程.

我对哈希键和所有内容都有很多问题,我认为我已经解决了所有这些问题,因为我的会话已经处于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下运行时不返回子类对象?

core-data – 为什么executeFetchRequest在使用Swift在XCTest下运行时不返回子类对象?

我有一个使用CoreData的 Swift项目和NSManagedobject设置的子类.它们具有类名设置(在xcdatamodel视图中),其中包括主要目标名称“MainTarget.MyEntity”.运行应用程序时一切正常.但是,我使用XCTest添加了一些单元测试,当将executeFetchRequest的结果转换为正确的类型时,应用程序开始与ERR_BAD_ACCESS或ERR_BAD_INSTRUCTION崩溃.我也试过在数组中转换每个元素,这也会导致崩溃.在我的所有测试用例中,错误都是零.

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
>敲打头撞墙,直到头晕.我建议不要采取这种措施,因此效率不高.

解决方法

我有一个类似的问题.让我的实体类公开解决问题,我得到正确的类类型.( CoreData class miss match in unit test)

execute executeQuery executeUpdate 三种的分别封装使用

execute executeQuery executeUpdate 三种的分别封装使用

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代
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 2executeFetchRequest:错误处理的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于6.7 Swift的do-try-catch错误处理模式 [Swift原创教程]、android – Request.executeMeRequestAsync(session,Request.GraphUserCallback())函数的问题、core-data – 为什么executeFetchRequest在使用Swift在XCTest下运行时不返回子类对象?、execute executeQuery executeUpdate 三种的分别封装使用等相关内容,可以在本站寻找。

本文标签: