2017-04-20 114 views
-6

這是我DatabaseHelper類SQLiteOpenHelper.getReadableDatabase()方法崩潰

public class DatabaseHelper extends SQLiteOpenHelper 

    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "MyAccountsDB.db"; 

    public static final String TABLE_Accounts = "Accounts"; 

    public static final String COLUMN_AccountID= "AccountID"; 
    public static final String COLUMN_WebSite= "WebSite"; 
    public static final String COLUMN_Email= "Email"; 
    public static final String COLUMN_UserName = "UserName"; 
    public static final String COLUMN_Password= "Password"; 


    private static final String TEXT_TYPE = " TEXT"; 
    private static final String INT_TYPE = " INTEGER"; 
    private static final String COMMA_SEP = ","; 

    private static final String SQL_CREATE_TABLE_Accounts = 
      "CREATE TABLE " + TABLE_Accounts + 
        " (" + 
        COLUMN_AccountID + INT_TYPE +" PRIMARY KEY AUTOINCREMENT NOT NULL"+ COMMA_SEP + 
        COLUMN_WebSite + TEXT_TYPE + COMMA_SEP + 
        COLUMN_Email + TEXT_TYPE + COMMA_SEP + 
        COLUMN_UserName + TEXT_TYPE + COMMA_SEP + 
        COLUMN_Password+ TEXT_TYPE + ")"; 
    public DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 


    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     db.execSQL(SQL_CREATE_TABLE_Accounts); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int i, int i1) 
    { 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_Accounts); 
     onCreate(db); 
    } 
    public void CreateAccount(Account acc) 
    { 
     SQLiteDatabase db = getWritableDatabase(); 

     String insertAccount = "Insert into Accounts (WebSite,Email,UserName,Password) values" + 
     "('" + acc.getWebSite() + "','" + acc.geteMail() + "','" + acc.getUserName() + "','" + acc.getPassWord() + "')"; 
     db.execSQL(insertAccount); 
    } 

    public ArrayList<Account> getAllAccounts() 
    { 
     String query = "SELECT AccountID , WebSite FROM Accounts"; 
     ArrayList<Account> Accounts = new ArrayList<Account>(); 
     SQLiteDatabase database = getReadableDatabase();//when its called here no problem and load all the accounts the way i want 
     Cursor c = database.rawQuery(query, null); 
     if (c != null) 
     { 
      while (c.moveToNext()) 
      { 
       Account acc = new Account(); 
       acc.setAccountID(c.getInt(0)); 
       acc.setWebSite(c.getString(1)); 
       Accounts.add(acc); 
      } 
     } 
     return Accounts; 
    } 
    public Account getAccountByID(int id) 
    { 
     Account acc = new Account(); 
     String query = "SELECT WebSite , eMail , UserName , Password from Accounts where AccountID = " + id; 
     SQLiteDatabase database = getReadableDatabase();//but when i call it here following exception thrown 
     Cursor c = database.rawQuery(query, null); 
     if (c != null) 
     { 
      while (c.moveToFirst()) 
      { 
       acc.setAccountID(c.getInt(0)); 
       acc.setWebSite(c.getString(1)); 
       acc.seteMail(c.getString(2)); 
       acc.setUserName(c.getString(3)); 
       acc.setPassWord(c.getString(4)); 
      } 
     } 
     return acc; 
    } 

NullPointerException : 
Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference 

我有同樣的方法和函數的語法另一個應用程序,它的工作沒有任何問題

+2

的可能重複的構造函數[什麼是空指針異常,怎麼解決呢?(http://stackoverflow.com/quest離子/ 218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+0

你是在字符串中放置列而不是使用'COLUMN_AccountID',例如?你真的需要將密碼存儲在Java'Account'對象中嗎? –

+0

謝謝你......但getReadableDatabase()的相同調用語法在getAllAccounts方法中工作良好 –

回答

0

謝謝大家...我已經找到了答案....我是從一個片段調用 getAccountById方法,所以,我必須重新通過 語境再次給它

UpdateAccountFragment a = new UpdateAccountFragment(accountID,getActivity()); 

UpdateAccountFragment樣子

public UpdateAccountFragment (int accountID , Context context) 
{ 
    this.context = context; 
    this.accountID = accountID; 
} 
+0

您不需要將上下文傳遞給任何片段。你可以簡單地在第二個片段中使用'getActivity()' –

+0

**是的。你的權利它的工作** –

-1

問題是在您的查詢中:

String query = "SELECT WebSite , eMail , UserName , Password from Accounts where AccountID = " + id; 

您已使用eMail而不是Email。您的Accounts表中名爲eMail的表中沒有column。還將from更改爲FROMwhere子條款更改爲WHERE

更改Query如下:

String query = "SELECT WebSite , Email , UserName , Password FROM Accounts WHERE AccountID = " + id; 

ActivityFragment像下面創建的DatabaseHelperinstance

從活動:

public class MainActivity extends AppCompatActivity { 

    DatabaseHelper db; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     db = new DatabaseHelper(this); // Context is this 

     ............... 
     .................... 
    } 

} 

從片段:

public class UpdateAccountFragment extends Fragment { 

    DatabaseHelper db; 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     db = new DatabaseHelper(getActivity()); // Context is getActivity() 

     ............... 
     .................... 
    } 
} 

希望這將有助於〜

+1

謝謝你表明你在哪裏調用該方法..我剛剛嘗試過電子郵件,但仍然是同樣的問題... –

+0

你爲什麼建議SQL注入? –

+1

再次感謝你......仍然沒有工作......我的問題不在SQL查詢中 –

0

我相信你需要以不同的方式創建數據庫幫手。

例如,

public class MainActivity extends Activity { 

    private DatabaseHelper db; // Don't initialize here 

    @Override 
    protected void onCreate(Bundle b) { 
     ... 
     db = new DatabaseHelper(this); // Do it here 
    } 
} 

,並應解決當前的錯誤,如果你使用整個活動同db變量,但你仍然有在SQL查詢等事項,不你的表定義相匹配。

您也不想使用while (c.moveToFirst()),除非您希望該循環永不結束。

public Account getAccountByID(int id) 
{ 
    Account acc = new Account(); 
    SQLiteDatabase database = getReadableDatabase(); 

    Cursor c = database.query(TABLE_Accounts, 
      { COLUMN_WebSite , COLUMN_Email , COLUMN_UserName , COLUMN_Password }, 
      COLUMN_AccountID + "=?", 
      { String.valueOf(id) }, 
      null, null, null, null); 
     );  

    try { 
     if (c != null && c.moveToFirst()) 
     { 
      acc.setAccountID(id); 
      acc.setWebSite(c.getString(0)); 
      acc.seteMail(c.getString(1)); 
      acc.setUserName(c.getString(2)); 
      acc.setPassWord(c.getString(3)); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (c != null) c.close(); 
    } 
    return acc; 
} 
+0

非常感謝你的代碼......但我已經解決了它:)....它是從另一個片段調用一個片段時,你必須通過活動的上下文它通過''getActivity()' –

+0

似乎是一個合理的解決方案。 –