2009-11-16 20 views
10

मुझे एंड्रॉइड में सीधी एसक्यूएल के साथ SQLite का उपयोग करके अच्छी किस्मत मिली है, लेकिन यह पहली बार है जब मैं ContentProvider में डीबी लपेट रहा हूं। getWritableDatabase() या getReadableDatabase() पर कॉल करते समय मुझे एक शून्य सूचक अपवाद मिल रहा है। क्या यह सिर्फ एक बेवकूफ गलती है जिसे मैंने अपने कोड में प्रारंभिकताओं के साथ बनाया है या क्या कोई बड़ा मुद्दा है?एंड्रॉइड पर SQLiteOpenHelper.getWriteableDatabase() शून्य सूचक अपवाद

public class DatabaseProvider extends ContentProvider { 
    ... 
    private DatabaseHelper     databaseHelper; 
    private SQLiteDatabase     db; 
    ... 
    @Override 
    public boolean onCreate() { 
    databaseHelper = new DatabaseProvider.DatabaseHelper(getContext()); 
    return (databaseHelper == null) ? false : true; 
    } 
    ... 
    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
    db = databaseHelper.getWritableDatabase(); // NULL POINTER EXCEPTION HERE 
    ... 
    } 
    private static class DatabaseHelper extends SQLiteOpenHelper { 
    public static final String DATABASE_NAME = "cogsurv.db"; 
    public static final int DATABASE_VERSION = 1; 

    public static final String[] TABLES = { 
     "people", 
     "travel_logs", 
     "travel_fixes", 
     "landmarks", 
     "landmark_visits", 
     "direction_distance_estimates" 
    }; 

    // people._id does not AUTOINCREMENT, because it's set based on server's people.id 
    public static final String[] CREATE_TABLE_SQL = { 
     "CREATE TABLE people (_id INTEGER PRIMARY KEY," + 
       "server_id INTEGER," + 
       "name VARCHAR(255)," + 
       "email_address VARCHAR(255))", 
     "CREATE TABLE travel_logs (_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
           "server_id INTEGER," + 
           "person_local_id INTEGER," + 
           "person_server_id INTEGER," + 
           "start DATE," + 
           "stop DATE," + 
           "type VARCHAR(15)," + 
           "uploaded VARCHAR(1))", 
     "CREATE TABLE travel_fixes (_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
           "datetime DATE, " + 
           "latitude DOUBLE, " + 
           "longitude DOUBLE, " + 
           "altitude DOUBLE," + 
           "speed DOUBLE," + 
           "accuracy DOUBLE," + 
           "travel_mode VARCHAR(50), " + 
           "person_local_id INTEGER," + 
           "person_server_id INTEGER," + 
           "travel_log_local_id INTEGER," + 
           "travel_log_server_id INTEGER," + 
           "uploaded VARCHAR(1))", 
     "CREATE TABLE landmarks (_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
           "server_id INTEGER," + 
           "name VARCHAR(150)," + 
           "latitude DOUBLE," + 
           "longitude DOUBLE," + 
           "person_local_id INTEGER," + 
           "person_server_id INTEGER," + 
           "uploaded VARCHAR(1))", 
     "CREATE TABLE landmark_visits (_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
            "server_id INTEGER," + 
            "person_local_id INTEGER," + 
            "person_server_id INTEGER," + 
            "landmark_local_id INTEGER," + 
            "landmark_server_id INTEGER," + 
            "travel_log_local_id INTEGER," + 
            "travel_log_server_id INTEGER," + 
            "datetime DATE," + 
            "number_of_questions_asked INTEGER," + 
            "uploaded VARCHAR(1))", 
     "CREATE TABLE direction_distance_estimates (_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
               "server_id INTEGER," + 
               "person_local_id INTEGER," + 
               "person_server_id INTEGER," + 
               "travel_log_local_id INTEGER," + 
               "travel_log_server_id INTEGER," + 
               "landmark_visit_local_id INTEGER," + 
               "landmark_visit_server_id INTEGER," + 
               "start_landmark_local_id INTEGER," + 
               "start_landmark_server_id INTEGER," + 
               "target_landmark_local_id INTEGER," + 
               "target_landmark_server_id INTEGER," + 
               "datetime DATE," + 
               "direction_estimate DOUBLE," + 
               "distance_estimate DOUBLE," + 
               "uploaded VARCHAR(1))" 
    }; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     Log.v(Constants.TAG, "DatabaseHelper()"); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Log.v(Constants.TAG, "DatabaseHelper.onCreate() starting"); 

     // create the tables 
     int length = CREATE_TABLE_SQL.length; 
     for (int i = 0; i < length; i++) { 
     db.execSQL(CREATE_TABLE_SQL[i]); 
     } 
     Log.v(Constants.TAG, "DatabaseHelper.onCreate() finished"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     for (String tableName : TABLES) { 
     db.execSQL("DROP TABLE IF EXISTS" + tableName); 
     } 
     onCreate(db); 
    } 
    } 
} 

हमेशा की तरह, सहायता के लिए धन्यवाद!

-

सुनिश्चित नहीं हैं कि इस विस्तार में मदद करता है, लेकिन यहाँ अगर LogCat अपवाद दिखा रहा है:

हटाया मृत ImageShack लिंक

+1

क्या आपको कभी इसका समाधान मिला? प्रतिक्रिया के लिए –

उत्तर

6
बजाय

:

databaseHelper = new DatabaseProvider.DatabaseHelper(getContext()); 

कोशिश:

databaseHelper = new DatabaseProvider.DatabaseHelper(this); 

और देखें कि क्या यह मदद करता है।

यदि ऐसा नहीं है, तो क्या आप NullPointerException स्टैक ट्रेस पोस्ट कर सकते हैं?

+0

धन्यवाद! दुर्भाग्य से यह मदद नहीं करता है। "यह" एक संदर्भ के बजाय एक सामग्री प्रदाता है। मैंने त्रुटि का एक स्क्रीनशॉट पोस्ट करने का प्रयास किया है। यह चौड़ा है, इसलिए आप इसे एक नए टैब में खोलना चाहेंगे। सुनिश्चित नहीं है कि वह विवरण वास्तव में मदद करता है, हालांकि ... –

+0

ओह, आप सही हैं - मैं सामग्री प्रदाता संदर्भ से विरासत प्राप्त करता हूं, और ऐसा नहीं करता है। स्टैक ट्रेस के संबंध में, यह मेरे लिए लोड नहीं हो रहा है। आप टेक्स्ट फ़ाइल के रूप में एक स्टैक ट्रेस के हिस्से को सहेजने के लिए डीडीएमएस (या ग्रहण में डीडीएमएस परिप्रेक्ष्य) का उपयोग कर सकते हैं। बस ब्याज की रेखाओं को हाइलाइट करें और LogCat टैब के टूलबार में सहेजें आइकन पर क्लिक करें। – CommonsWare

+0

अधिक सहायता की पेशकश के लिए धन्यवाद! बस दूसरे दिन, मैं एक एंड्रॉइड समर्थक के साथ बैठ गया, और वह मेरी समस्या को ठीक करने में सक्षम था: getWritableDatabase() को insert() –

0

सुनिश्चित करें कि जब आप एवीडी बना रहे हों, तो कुछ एसडी कार्ड स्पेस निर्दिष्ट करें। मुझे एक ही समस्या थी और यह हल हो गया। यदि इससे मदद नहीं मिलती है, तो आप एमुलेटर को -वाइप-डेटा विकल्प के साथ शुरू करने का भी प्रयास कर सकते हैं।

+0

सुझाव के लिए धन्यवाद, लेकिन मैं हमेशा एक वास्तविक डिवाइस पर परीक्षण करता हूं, इसलिए मुझे नहीं लगता कि यह मुद्दा है। –

+0

-वाइप-डेटा विकल्प के बारे में क्या? शायद यह इसे काम करने में मदद कर सकता है। – jaxvy

2

यह त्रुटि गलत संदर्भ में पारित होने से लगभग निश्चित रूप से है:

super(context, DATABASE_NAME, null, DATABASE_VERSION); 
2

मैं सिर्फ एक गैर गतिविधि में SQLite NullPointerException के साथ इस समस्या थी और समस्या यह है कि यह गलत संदर्भ था।

मेरा फिक्स कन्स्ट्रक्टर के बजाय क्रिएट पर संदर्भ पारित कर रहा था। getApplicationContext() करने के लिए किसी अन्य स्थान से संदर्भ ढूंढने का प्रयास करें।

1

कुछ समय में कोशिश उपयोग getWritableDatabase() के बाद आप सहायक प्रारंभिक आप NullPointerException मिला कारण डेटाबेस पूरी तरह से तैयार नहीं था और ui सूत्र में, या यह ANR

0

का कारण हो सकता है कि मैं इस मिला नहीं करते getReadableDatabase() को क्वेरी के अंदर बुलाया जा रहा है जब एक ही NullPointerException त्रुटि() क्योंकि मैं अनुचित रूप से मेरे सामग्री प्रदाता से पूछताछ कर रहा था। मैं आपके डेटाबेस का निर्माण करने के तरीके से कुछ भी गलत नहीं देख सकता। getContext() आपको उचित संदर्भ वस्तु देना चाहिए। हालांकि, मैं इस बात पर ध्यान देना चाहूंगा कि आप सामग्री प्रदाता को अपने प्रश्न कैसे बना रहे हैं। आपको यह सुनिश्चित करना चाहिए कि आपके पास अपने कंटेंट रिज़ॉल्वर का एक वैध संदर्भ है (यानी getContentResolver() क्वेरी (..) को कॉल करके) और क्वेरी का प्रदर्शन करने के लिए इसका उपयोग कर रहा है।

1

मुझे अभी यह समस्या थी और मुझे एहसास हुआ कि यह एक लाल हेरिंग का थोड़ा सा था।

मेरी समस्या जिस तरह से मैं ContentProvider का उपयोग कर रहा था, से मेरा मुद्दा सामने आया।

मैं वास्तव में ContentResolver के बजाय सामग्री प्रदाता का उपयोग कर रहा था। यदि ContentProviders का उपयोग करने के लिए आपका नया प्रयास करना अनिवार्य रूप से एक आसान तरीका है।

आशा है कि मदद करता है :)

संबंधित मुद्दे