2013-03-13 79 views
3

我试图在我点击按钮btnDelete时自动从我的数据库表中获取URL。问题是,它从数据库返回正确的价值观,但试图把它与时:从数据库中自动获取URL

Uri uri = Uri.parse(TAG_url); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(intent); 

它说,“不幸的是,访问数据库已停止。”

当我做从它只返回“URL”但是当我使用

txtDesc.setText(product.getString(TAG_url)); 

它正确地显示来自数据库的链接TAG_url一个Log.d()

03-14 11:50:18.169: E/Trace(5227): error opening trace file: No such file or directory (2) 
03-14 11:50:31.499: E/AndroidRuntime(5227): FATAL EXCEPTION: main 
03-14 11:50:31.499: E/AndroidRuntime(5227): java.lang.NullPointerException: uriString 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at android.net.Uri$StringUri.<init>(Uri.java:464) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at android.net.Uri$StringUri.<init>(Uri.java:454) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at android.net.Uri.parse(Uri.java:426) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at com.example.androidhive.EditProductActivity1$2.onClick(EditProductActivity1.java:106) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at android.view.View.performClick(View.java:4084) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at android.view.View$PerformClick.run(View.java:16966) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at android.os.Handler.handleCallback(Handler.java:615) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at android.os.Looper.loop(Looper.java:137) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
03-14 11:50:31.499: E/AndroidRuntime(5227):  at dalvik.system.NativeStart.main(Native Method) 
03-14 11:50:44.299: E/Trace(5251): error opening trace file: No such file or directory (2) 

有人能帮助我吗?

package com.example.androidhive; 

import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

public class EditProductActivity extends Activity { 

    EditText txtName; 
    EditText txtPrice; 
    EditText txtDesc; 
    EditText txtimg; 
    EditText txtCreatedAt; 
    Button btnSave; 
    Button btnDelete; 
    Button btnvideo; 

    String pid; 
    String url; 

    // Progress Dialog 
    private ProgressDialog pDialog; 

    // JSON parser class 
    JSONParser jsonParser = new JSONParser(); 

    // single product url 
    private static final String url_product_detials = "http://10.0.2.2/android_connect/get_product_details.php"; 

    // url to update product 
    private static final String url_update_product = "http://10.0.2.2/android_connect/update_product.php"; 

    // url to delete product 
    private static final String url_delete_product = "http://10.0.2.2/android_connect/delete_product.php"; 

    // JSON Node names 
    private static final String TAG_SUCCESS = "success"; 
    private static final String TAG_PRODUCT = "product"; 
    private static final String TAG_PID = "pid"; 
    private static final String TAG_NAME = "name"; 
    private static final String TAG_PRICE = "price"; 
    private static final String TAG_DESCRIPTION = "description"; 
    private static final String TAG_img = "img"; 
    private static final String TAG_url = "url"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.edit_product); 

     // save button 
     btnSave = (Button) findViewById(R.id.btnSave); 
     btnDelete = (Button) findViewById(R.id.btnDelete); 

     // getting product details from intent 
     Intent i = getIntent(); 

     // getting product id (pid) from intent 
     pid = i.getStringExtra(TAG_PID); 

     // Getting complete product details in background thread 
     new GetProductDetails().execute(); 

     // save button click event 
     btnSave.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // starting background task to update product 
       new SaveProductDetails().execute(); 
      } 
     }); 

     // Delete button click event 
     btnDelete.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // deleting product in background thread 
       Log.v(TAG_url, "index="); 
       Uri uri = Uri.parse(TAG_url); 
       Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
       startActivity(intent); 

      } 
     }); 
    } 

    /** 
    * Background Async Task to Get complete product details 
    * */ 
    class GetProductDetails extends AsyncTask<String, String, String> { 

     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(EditProductActivity.this); 
      pDialog.setMessage("Loading movies details. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
     } 

     /** 
     * Getting product details in background thread 
     * */ 
     protected String doInBackground(String... params) { 
      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 

       public void run() { 
        // Check for success tag 
        int success; 
        try { 
         // Building Parameters 
         List<NameValuePair> params = new ArrayList<NameValuePair>(); 
         params.add(new BasicNameValuePair("pid", pid)); 

         // getting product details by making HTTP request 
         // Note that product details url will use GET request 
         JSONObject json = jsonParser.makeHttpRequest(
           url_product_detials, "GET", params); 

         // check your log for json response 
         Log.d("Single Product Details", json.toString()); 

         // json success tag 
         success = json.getInt(TAG_SUCCESS); 
         if (success == 1) { 
          // successfully received product details 
          JSONArray productObj = json 
            .getJSONArray(TAG_PRODUCT); // JSON Array 

          // get first product object from JSON Array 
          JSONObject product = productObj.getJSONObject(0); 

          // product with this pid found 
          // Edit Text 
          url = TAG_url; 
          Log.v(url, "index="); 
          txtName = (EditText) findViewById(R.id.inputName); 
          txtPrice = (EditText) findViewById(R.id.inputPrice); 
          txtDesc = (EditText) findViewById(R.id.inputDesc); 
          // txtimg = (EditText) findViewById(R.id.inputimg); 

          // display product data in EditText 
          txtName.setText(product.getString(TAG_NAME)); 
          txtPrice.setText(product.getString(TAG_PRICE)); 
          txtDesc.setText(product.getString(TAG_url)); 
          txtimg.setText(product.getString(TAG_img)); 
         } else { 
          // product with pid not found 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 

       private String getText(String string) { 
        // TODO Auto-generated method stub 
        return null; 
       } 
      }); 

      return null; 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog once got all details 
      pDialog.dismiss(); 
     } 
    } 

    /** 
    * Background Async Task to Save product Details 
    * */ 
    class SaveProductDetails extends AsyncTask<String, String, String> { 

     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(EditProductActivity.this); 
      pDialog.setMessage("Saving product ..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
     } 

     /** 
     * Saving product 
     * */ 
     protected String doInBackground(String... args) { 
      // getting updated data from EditTexts 
      String name = txtName.getText().toString(); 
      String price = txtPrice.getText().toString(); 
      String description = txtDesc.getText().toString(); 
      String img = txtimg.getText().toString(); 

      // Building Parameters 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 
      params.add(new BasicNameValuePair(TAG_PID, pid)); 
      params.add(new BasicNameValuePair(TAG_NAME, name)); 
      params.add(new BasicNameValuePair(TAG_PRICE, price)); 
      params.add(new BasicNameValuePair(TAG_DESCRIPTION, description)); 
      params.add(new BasicNameValuePair(TAG_img, img)); 
      params.add(new BasicNameValuePair(TAG_url, url)); 

      // sending modified data through http request 
      // Notice that update product url accepts POST method 
      JSONObject json = jsonParser.makeHttpRequest(url_update_product, 
        "POST", params); 

      // check json success tag 
      try { 
       int success = json.getInt(TAG_SUCCESS); 

       if (success == 1) { 
        // successfully updated 
        Intent i = getIntent(); 
        // send result code 100 to notify about product update 
        setResult(100, i); 
        finish(); 
       } else { 
        // failed to update product 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog once product uupdated 
      pDialog.dismiss(); 
     } 
    } 
} 

回答

1

它看起来对我说,VAR TAG_url旨在仅作为一个描述符,而不是作为一个可变对象。首先您将:private static final String TAG_url = "url";定义为节点名称。使用txtDesc.setText(product.getString(TAG_url));的作品是因为您正在检索与节点“url”相关联的数据(这是TAG_url拥有的数据)。在这种情况下,数据不在TAG_url var中,但使用TAG_url作为查找数据的关键。

TAG_url的任何日志引用将返回它的内容:url。同样,使用TAG_url的解析调用也将使用它的内容。因此,Uri uri = Uri.parse(TAG_url);实际上是调用Uri uri = Uri.parse("url"); - 所以错误。

您应该在parse调用中将TAG_url替换为保存您打算调用的实际url的var。在数据库调用期间,您应该将该URL存储在单独的变量中,然后解析它。

编辑:

不知道你的JSON或其他数据的结构,我也说不准。但是作为例子,我们假设通过调用product.getString(TAG_url)从数据库返回的数据是要发送给解析器的数据。 (我假设,因为你提到的数据被正确设置到TextView的txtDesc当通过txtDesc.setText(product.getString(TAG_url));调用。)

鉴于这种情况,你可以在类的顶部创建一个字段String incomingURL;,并分配的结果数据库调用如incomingURL = product.getString(TAG_url);。然后,您将使用新的字段设置TextView,如txtDesc.setText(incomingURL);

然后,使用该变量进行解析:Uri uri = Uri.parse(incomingURL);这将从数据库调用中获取数据,并将其放置在解析器中。请记住,如果在数据库调用完成之前单击此按钮,则需要检查incomingURL为空。

+0

你能给我一个帮助,将实际的URL存储在一个单独的var?我以不同的方式尝试过好几次,看来我做了一些错误的事情,我不能再继续研究它,它会返回所有网址:/我真的会为你提供帮助。 谢谢 – 2013-03-14 09:19:21

+0

评论已被添加至答案 - 评论箱太长! :) – 2013-03-14 17:01:16