1

過去三天,我無法理解面臨的問題。我得到了一些變量的空值,而不是其他值,或者有時候是全部值。在運行棒棒糖的三星設備上特別遇到了這個問題。三星棒棒糖設備上的奇怪SQLite錯誤

我基本上做的是通過SQlitehandler類將服務器返回的用戶數據存儲在我的LoginActivity中,然後稍後從mainactivity使用該數據。 Sqlitehandler隨機返回null,所以我無法確定數據庫是否在LoginActivity中正確寫入,或者在讀取時是否存在訪問問題。我發佈了LoginActivity和SqliteHandler類的相關部分。請需要一些幫助。

@Override 
     public void onResponse(String response) { 
      Log.d(TAG, "Login Response: " + response); 
      hideDialog(); 

      try { 
       JSONObject jObj = new JSONObject(response); 
       boolean error = jObj.getBoolean("error"); 

       // Check for error node in json 
       if (!error) { 
        // user successfully logged in 
        // Create login session 


        // Now store the user in SQLite 
        String api_key = jObj.getString("api_key"); 

        //JSONObject user = jObj.getJSONObject("user"); 
        String name = jObj.getString("name"); 
        String email = jObj.getString("email"); 
        int user_id = jObj.getInt("user_id"); 

        JSONObject authorization = jObj.getJSONObject("authorizations"); 
        int pro_app = authorization.getInt("pro_app"); 

        // Inserting row in users table 
        // SQLite database handler 
        db = new SQLiteHandler(LoginActivity.this); 
        db.addUser(name, email, user_id, api_key); 
        db.addAuthorizations(pro_app); 

        // Set the log level to verbose. 

        String user_id_string = String.valueOf("user_id"); 
        String pro_app_string = String.valueOf("pro_app"); 


        session.setLogin(true); 
        Toast.makeText(LoginActivity.this, "You have successfully logged in! Please wait while application loads.", Toast.LENGTH_LONG).show(); 

        // Launch main activity 
        Intent intent = new Intent(LoginActivity.this, 
          SplashActivity.class); 
        startActivity(intent); 
        finish(); 
       } else { 
        // Error in login. Get the error message 

        String errorMsg = jObj.getString("message"); 
        if (errorMsg.equals("") || errorMsg.isEmpty()) { 
         errorMsg = "An unusual error occurred. Please try again"; 
        } 
        Toast.makeText(getApplicationContext(), 
          errorMsg, Toast.LENGTH_LONG).show(); 
       } 
      } catch (Exception e) { 
       // JSON error 
       hideDialog(); 
       e.printStackTrace(); 
       Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 

     } 

以下是SQLiteHandler:

public class SQLiteHandler extends SQLiteOpenHelper { 

    private static final String TAG = SQLiteHandler.class.getSimpleName(); 

    // All Static variables 
    // Database Version 
    private static final int DATABASE_VERSION = 1; 

    // Database Name 
    private static final String DATABASE_NAME = "android_api"; 

    // Login table name 
    private static final String TABLE_USER = "user"; 
    private static final String TABLE_AUTH = "authorizations"; 

    // Login Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_USER_ID = "user_id"; 
    private static final String KEY_API = "api_key"; 
    private static final String KEY_PRO = "pro_app"; 


    public SQLiteHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_USER + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
       + KEY_EMAIL + " TEXT UNIQUE," + KEY_USER_ID + " INTEGER UNIQUE," + KEY_API + " TEXT" + ")"; 
     db.execSQL(CREATE_LOGIN_TABLE); 

     String CREATE_AUTH_TABLE = "CREATE TABLE " + TABLE_AUTH + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_PRO + " INTEGER" 
       + ")"; 
     db.execSQL(CREATE_AUTH_TABLE); 

     Log.d(TAG, "Database tables created"); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     Log.d(TAG, "onUpgrade() from " + oldVersion + " to " + newVersion); 

     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_AUTH); 

     // Create tables again 
     onCreate(db); 
    } 

    /** 
    * Storing user details in database 
    */ 
    public void addUser(String name, String email, int user_id, String c_code, String phone, String api_key, int status, String created_at) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, name); // Name 
     values.put(KEY_EMAIL, email); // Email 
     values.put(KEY_USER_ID, user_id); // Email 
     values.put(KEY_API, api_key); // API 

     // Inserting Row 
     long id = db.insert(TABLE_USER, null, values); 
     db.close(); // Closing database connection 

     Log.d(TAG, "New user inserted into sqlite: " + id); 
    } 


    public void addAuthorizations(int pro_app, int no_ads, int pro_original) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_PRO, pro_app); // Pro version? 

     // Inserting Row 
     long id = db.insert(TABLE_AUTH, null, values); 
     db.close(); // Closing database connection 

     Log.d(TAG, "New auth inserted into sqlite: " + id); 
    } 

    public void updateAuthorizations(int pro_app, int no_ads, int pro_original) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_PRO, pro_app); // Pro version? 
     values.put(KEY_ADS, no_ads); // No Ads? 
     values.put(KEY_PRO_ORIGINAL, pro_original); //pro origin 

     // Inserting Row 
     db.update(TABLE_AUTH, values, "id=1", null); 
     db.close(); // Closing database connection 

     Log.d(TAG, "New auth updated into sqlite "); 
    } 


    /** 
    * Getting user data from database 
    */ 
    public HashMap<String, Object> getUserDetails() { 
     HashMap<String, Object> user = new HashMap<String, Object>(); 
     String selectQuery = "SELECT * FROM " + TABLE_USER; 

     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     // Move to first row 
     cursor.moveToFirst(); 
     if (cursor.getCount() > 0) { 
      user.put("name", cursor.getString(1)); 
      user.put("email", cursor.getString(2)); 
      user.put("user_id", cursor.getInt(3)); 
      user.put("api_key", cursor.getString(4)); 

     } 
     cursor.close(); 
     db.close(); 
     // return user 
     Log.d(TAG, "Fetching user from Sqlite: " + user.toString()); 

     return user; 
    } 

    public HashMap<String, Integer> getUserAuthorizations() throws Exception{ 
     HashMap<String, Integer> auth = new HashMap<String, Integer>(); 
     String selectQuery = "SELECT * FROM " + TABLE_AUTH; 

     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     // Move to first row 
     cursor.moveToFirst(); 
     if (cursor.getCount() > 0) { 
      auth.put("pro_app", cursor.getInt(1)); 
     } 
     cursor.close(); 
     db.close(); 
     // return user 
     try { 
      int authINT = auth.get("pro_app"); 
     } catch (Exception e){ 
      Crashlytics.log("this is what is throwing the error"); 
      Crashlytics.logException(e); 
     } 
     int authINTNEXT = auth.get("pro_app"); 


     return auth; 
    } 

    /** 
    * Re crate database Delete all tables and create them again 
    */ 
    public void deleteUsers() { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     // Delete All Rows 
     db.delete(TABLE_USER, null, null); 
     db.delete(TABLE_AUTH, null, null); 
     db.close(); 

     Log.d(TAG, "Deleted all user info from sqlite"); 
    } 


} 

錯誤我得到的Crashlytics:

Non-fatal Exception: java.lang.NullPointerException 
Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference 
raw 
com.blueinklabs.investifystocks.helper.SQLiteHandler.getUserAuthorizations (SourceFile:198) 
com.blueinklabs.investifystocks.StorageMethod.loadDatabaseData (SourceFile:65) 
com.blueinklabs.investifystocks.MainActivity.onCreate (SourceFile:183) 
android.app.Activity.performCreate (Activity.java:5993) 
android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1111) 
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2418) 
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2530) 
android.app.ActivityThread.access$900 (ActivityThread.java:163) 
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1358) 
android.os.Handler.dispatchMessage (Handler.java:102) 
android.os.Looper.loop (Looper.java:135) 
android.app.ActivityThread.main (ActivityThread.java:5536) 
java.lang.reflect.Method.invoke (Method.java) 
java.lang.reflect.Method.invoke (Method.java:372) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1397) 
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1192) 
+1

問題是什麼? –

+0

getUserDetails()和getUserAuthorizations()隨機給出空指針異常。我甚至看到授權正確返回整數但在電子郵件字段中返回null的情況。令人難以置信。甚至無法重新創建自己,因爲這是在很少的銀河棒棒糖設備上面臨的(我無法訪問它)。 – dejavu89

+0

logcat在哪裏?添加了 –

回答

2

其實這個問題是Cursor是從0點返回的數據,因此,這意味着你獲得了0,1,2的記錄..態度。檢查下面

/** 
* Getting user data from database 
*/ 
public HashMap<String, Object> getUserDetails() { 
    HashMap<String, Object> user = new HashMap<String, Object>(); 
    String selectQuery = "SELECT * FROM " + TABLE_USER; 

    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 
    // Move to first row 
    cursor.moveToFirst(); 
    if (cursor.getCount() > 0) { 
     user.put("name", cursor.getString(0)); 
     user.put("email", cursor.getString(1)); 
     user.put("user_id", cursor.getInt(2)); 
     user.put("api_key", cursor.getString(3)); 

    } 
    cursor.close(); 
    db.close(); 
    // return user 
    Log.d(TAG, "Fetching user from Sqlite: " + user.toString()); 

    return user; 
} 

public HashMap<String, Integer> getUserAuthorizations() throws Exception{ 
    HashMap<String, Integer> auth = new HashMap<String, Integer>(); 
    String selectQuery = "SELECT * FROM " + TABLE_AUTH; 

    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 
    // Move to first row 
    cursor.moveToFirst(); 
    if (cursor.getCount() > 0) { 
     auth.put("pro_app", cursor.getInt(0)); 
    } 
    cursor.close(); 
    db.close(); 
    // return user 
    try { 
     int authINT = auth.get("pro_app"); 
    } catch (Exception e){ 
     Crashlytics.log("this is what is throwing the error"); 
     Crashlytics.logException(e); 
    } 
    int authINTNEXT = auth.get("pro_app"); 


    return auth; 
} 

畝代碼或我有另一種方式來獲得記錄基於列名按下面的代碼

public static String getString(Cursor cursor, String fieldName, String nullValue) { 
    int column = cursor.getColumnIndex(fieldName); 

    if (cursor.isNull(column)) 
     return nullValue; 
    else 
     return cursor.getString(column); 
} 

public static int getInt(Cursor cursor, String fieldName, int nullValue) { 
    int column = cursor.getColumnIndex(fieldName); 

    if (cursor.isNull(column)) 
     return nullValue; 
    else 
     return cursor.getInt(column); 
} 

和實施類似

public HashMap<String, Object> getUserDetails() { 
    HashMap<String, Object> user = new HashMap<String, Object>(); 
    String selectQuery = "SELECT * FROM " + TABLE_USER; 

    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 
    // Move to first row 
    cursor.moveToFirst(); 
    if (cursor.getCount() > 0) { 
     user.put("name", getString(cursor , NAME_COLUMN, "")); 
     user.put("email", getString(cursor , EMAIL_COLUMN, "")); 
     user.put("user_id", getInt(cursor ,USER_ID_COLUMN,0)); 
     user.put("api_key",getString(cursor , API_KEY_COLUMN, "")); 

    } 
    cursor.close(); 
    db.close(); 
    // return user 
    Log.d(TAG, "Fetching user from Sqlite: " + user.toString()); 

    return user; 
} 

和其他做方法

+0

實際上0是用於Primary ID鍵的,我沒有這樣使用,但是我意識到我沒有啓動表來自動增加主鍵和我沒有在添加用戶或授權時放置任何主鍵值,你可以評論這是否是這種情況,謝謝領導 – dejavu89

+1

@ dejavu89好的,你應該改變'String selectQuery =「 SELECT COLUMN你想要的名字FROM「+ TABLE_AUTH;'。不要每次都使用'*'因爲它會得到所有的記錄,並且需要一些時間 –

+1

謝謝,我會牢記這一點,但是你認爲不要啓動一個主鍵是這裏的基本問題?(我沒有添加自動增量,我也沒有添加th e行創建主鍵) – dejavu89

相關問題