2013-01-21 3 views
7

JSON 배열의 데이터를 SQLite 데이터베이스에 삽입하고 싶습니다. 나는 CategoryRelper.java와 AndroidJSONParsingActivity.java 두 클래스를 만들어 자바 응답을 얻는다. 코드를 실행하면 예외가 발생합니다 databaseHelper.saveCategoryRecord(id,name); 내 API가 제대로 작동하고 데이터를 제공합니다.JSON 데이터를 android의 SQLite 데이터베이스에 삽입하십시오.

내 코드는 다음과 같습니다 :

CategoryHelper.java

package com.androidhive.jsonparsing; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class CategoryHelper { 
    private static final int DATABASE_VERSION = 2; 
    private static final String DATABASE_NAME = "category.db"; 
    private static final String TABLE_NAME = "tbcategory"; 
    public static final String CATEGORY_COLUMN_ID = "_id"; 
    public static final String CATEGORY_COLUMN_NAME = "name"; 
    Category openHelper; 
    private SQLiteDatabase database; 

    public CategoryHelper(Context context){ 
     openHelper = new Category(context); 
     database = openHelper.getWritableDatabase(); 
    } 
    public void saveCategoryRecord(String id, String name) { 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(CATEGORY_COLUMN_ID, id); 
     contentValues.put(CATEGORY_COLUMN_NAME, name); 
     database.insert(TABLE_NAME, null, contentValues); 
     } 
    public Cursor getTimeRecordList() { 
     return database.rawQuery("select * from " + TABLE_NAME, null); 
     } 
    private class Category extends SQLiteOpenHelper { 

     public Category(Context context) { 
      // TODO Auto-generated constructor stub 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      // TODO Auto-generated method stub 
      db.execSQL("CREATE TABLE " + TABLE_NAME + "(" 
        + CATEGORY_COLUMN_ID + " INTEGER PRIMARY KEY, " 
        + CATEGORY_COLUMN_NAME + " TEXT)"); 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // TODO Auto-generated method stub 
      db.execSQL("DROP TABLE IF EXISTS"+ TABLE_NAME); 
      onCreate(db); 
     } 

    } 
} 

AndroidJSONParsingActivity.java

package com.androidhive.jsonparsing; 
import java.util.ArrayList; 
import java.util.HashMap; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.app.ListActivity; 
import android.content.Intent; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

public class AndroidJSONParsingActivity extends ListActivity { 

    // url to make request 
    private static String url="API TO GET THE DATA"; 
    // JSON Node names 
    private static final String TAG_CATEGORY = "categories"; 
    private static final String TAG_CATEGORY_ID = "category_id"; 
    private static final String TAG_NAME = "name"; 
    private static final String TAG_IS_ACTIVE = "is_active"; 
    // contacts JSONArray 
    JSONArray contacts = null; 
    private CategoryHelper databaseHelper; 
    //private SQLiteDatabase mydatabase = null; 

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

     // Hashmap for ListView 
     ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>(); 

     // Creating JSON Parser instance 
     JSONParser jParser = new JSONParser(); 

     // getting JSON string from URL 
     JSONObject json = jParser.getJSONFromUrl(url); 

     try { 
      // Getting Array of Contacts 
      contacts = json.getJSONArray(TAG_CATEGORY); 

      // looping through All Contacts 
      for(int i = 0; i < contacts.length(); i++){ 
       JSONObject c = contacts.getJSONObject(i); 

       // Storing each json item in variable 
       String id = c.getString(TAG_CATEGORY_ID); 
       String name = c.getString(TAG_NAME); 
       String is_active = c.getString(TAG_IS_ACTIVE); 

       databaseHelper.saveCategoryRecord(id,name); 

       // creating new HashMap 
       HashMap<String, String> map = new HashMap<String, String>(); 

       // adding each child node to HashMap key => value 
       map.put(TAG_CATEGORY_ID, id); 
       map.put(TAG_NAME, name); 
       map.put(TAG_IS_ACTIVE, is_active); 
       // adding HashList to ArrayList 
       contactList.add(map); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


     /** 
     * Updating parsed JSON data into ListView 
     * */ 
     ListAdapter adapter = new SimpleAdapter(this, contactList, 
       R.layout.list_item, 
       new String[] { TAG_NAME, TAG_IS_ACTIVE, TAG_CATEGORY_ID }, new int[] { 
         R.id.name, R.id.email, R.id.mobile }); 

     setListAdapter(adapter); 

     // selecting single ListView item 
     ListView lv = getListView(); 

     // Launching new screen on Selecting Single ListItem 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // getting values from selected ListItem 
       String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
       String cost = ((TextView) view.findViewById(R.id.email)).getText().toString(); 
       String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString(); 

       // Starting new intent 
       Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class); 
       in.putExtra(TAG_NAME, name); 
       in.putExtra(TAG_IS_ACTIVE, cost); 
       in.putExtra(TAG_CATEGORY_ID, description); 
       startActivity(in); 

      } 
     }); 



    } 

} 

로그 캣 :

01-21 20:13:49.226: E/AndroidRuntime(301): FATAL EXCEPTION: main 
01-21 20:13:49.226: E/AndroidRuntime(301): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhive.jsonparsing/com.androidhive.jsonparsing.AndroidJSONParsingActivity}: java.lang.NullPointerException 
01-21 20:13:49.226: E/AndroidRuntime(301): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
01-21 20:13:49.226: E/AndroidRuntime(301): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
01-21 20:13:49.226: E/AndroidRuntime(301): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
01-21 20:13:49.226: E/AndroidRuntime(301): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
01-21 20:13:49.226: E/AndroidRuntime(301): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-21 20:13:49.226: E/AndroidRuntime(301): at android.os.Looper.loop(Looper.java:123) 
01-21 20:13:49.226: E/AndroidRuntime(301): at android.app.ActivityThread.main(ActivityThread.java:4627) 
01-21 20:13:49.226: E/AndroidRuntime(301): at java.lang.reflect.Method.invokeNative(Native Method) 
01-21 20:13:49.226: E/AndroidRuntime(301): at java.lang.reflect.Method.invoke(Method.java:521) 
01-21 20:13:49.226: E/AndroidRuntime(301): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-21 20:13:49.226: E/AndroidRuntime(301): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-21 20:13:49.226: E/AndroidRuntime(301): at dalvik.system.NativeStart.main(Native Method) 
01-21 20:13:49.226: E/AndroidRuntime(301): Caused by: java.lang.NullPointerException 
01-21 20:13:49.226: E/AndroidRuntime(301): at com.androidhive.jsonparsing.AndroidJSONParsingActivity.onCreate(AndroidJSONParsingActivity.java:65) 
01-21 20:13:49.226: E/AndroidRuntime(301): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-21 20:13:49.226: E/AndroidRuntime(301): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

나는를 삽입 할 수있는 방법 나를 인도 해주십시오 JSON 배열 데이터를 데이터베이스 또는 내가 잘못하고있는 위치. 모든 응답은 상당합니다.

+0

내 안드로이드 매니페스트 파일을 보여주세요. –

+0

@DawidSajdak 이것이 내 매니페스트입니다. http://pastebin.com/Tr2ukz45 – ADB

+1

JSON 구문 분석 중에 'NullPointerException'이 발생합니다. 즉, JSON 어딘가에 값이 없거나 null 값이 있음을 의미합니다. 내가 읽고 싶어하는 각 값을 logcat에 로깅하여 무슨 일이 일어나고 있는지 더 잘 알 수 있고, 비교할 때 읽으려는 JSON 문자열을 볼 수도있다. –

답변

13

databaseHelper 개체를 사용하기 전에 oncreate에 초기화하는 것을 잊지 마십시오.

db.execSQL("DROP TABLE IF EXISTS"+ TABLE_NAME); 

당신은 후 공백 문자를 잊어 EXISTS 한 :

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     databaseHelper=new CategoryHelper(AndroidJSONParsingActivity.this); 
     //your code here.......... 
+0

올바른 방법을 보여 주셔서 고마워요. – ADB

+0

@ 바이러스 : 가장 환영받은 친구 –

5

databaseHelper을 인스턴스화하지 마십시오. null 객체에 대해서는 메서드를 호출 할 수 없습니다.

+0

답장을 보내 주셔서 감사합니다. – ADB

3

는 그리고 여기 또 하나의 작은 문제가 있습니다. 다음과 같이 표시되어야합니다.

db.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME); 
관련 문제