2014-01-29 37 views
2

崩潰我是php開發人員,試圖學習android,我試圖設置一個數據庫並插入一些數據。Android應用程序在getWritableDatabase()或getReadableDatabase()

我跟着一些教程,但我的應用程序卡住了,當我使用getWritableDatabase()getReadableDatabase()

以下是我創建的我的DBHelper的代碼。

package com.example.bootstart;

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DBHelper extends SQLiteOpenHelper { 
    private static final String LOGTAG = "THEDBHELPER"; 

    private static final String DATABASE_NAME = "geolocation.db"; 
    private static final int DATABASE_VERSION = 1; 

    private static final String TABLE_LOCATIONS = "locations"; 
    private static final String COLUMN_ID = "id"; 
    private static final String COLUMN_welawa = "welawa"; 
    private static final String COLUMN_lati = "latitude"; 
    private static final String COLUMN_longi = "longitude"; 

    private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_LOCATIONS + " (" 
      + COLUMN_ID + "INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_welawa + " TEXT, " + COLUMN_lati 
      + " TEXT, " + COLUMN_longi + " TEXT)"; 


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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(TABLE_CREATE); 
     Log.i(LOGTAG, "TABLE HAS BEEN CREATED"); 
    } 

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

} 

我通過我的MainActivity類訪問它。

package com.example.bootstart; 

import android.os.Bundle; 
import android.widget.Toast; 
import android.app.Activity; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 


public class MainActivity extends Activity { 
    SQLiteOpenHelper dbhelper; 
    SQLiteDatabase database; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toast.makeText(getApplicationContext(), "Main Activity", Toast.LENGTH_LONG).show(); 

     dbhelper = new DBHelper(this); 
      //Works upto here 
     database = dbhelper.getReadableDatabase(); //App crashes on this line 


    } 
} 

我的模擬器在每次啓動時崩潰,所以我一直在用我的手機進行測試。

我最小的SDK是8,如果它是任何幫助。

任何幫助是非常感謝的傢伙。

+0

我不知道這是你的崩潰的原因,但你的CREATE語句無效。 'id'後面沒有空格,所以你的字符串將是..「.... idINTEGER PRIMARY ....」。首先解決這個問題,然後重試。 – Larry

+0

張貼您的logcat –

+0

@Larry,傻我。有效。謝謝larry。把它作爲答案將雅? :P –

回答

2

記錄只需在

private static final String COLUMN_ID = "id"; 

我總是打印我的數據庫命令在日誌中的代碼構建「身份證」後添加一個空格來檢查,因爲我總是用失誤空格,括號或逗號。節省很多心痛。

+1

+1打印命令是理解該查詢實際將如何執行的好主意。 –

+0

好的建議。真的救了我幾個小時。 –

1

正如@Larry建議的那樣,您在查詢中遇到問題。使用這個

private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_LOCATIONS + " (" 
      + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_welawa + " TEXT, " + COLUMN_lati 
      + " TEXT, " + COLUMN_longi + " TEXT)"; 

然後我認爲你的代碼會執行。不過,我認爲你想在你的Activity類中創建一些方法來從數據庫中獲取數據。這沒有錯,但更有效的方法如下。

DBHelper class中創建您的方法,並在那裏使用dbhelper.getReadableDatabase();。例如,如果你想在你的表中獲得全部記錄。將以下代碼添加到您的DBHelper類。

public int getTotalRecords() { 
     SQLiteDatabase sqLiteDatabase = this.getReadableDatabase(); 
     Cursor cursor = sqLiteDatabase.query(TABLE_LOCATIONS, null, null, null, null, null, null, null); 
     return cursor.getCount(); 
    } 

然後在MainActivity得到總數沒有。像這樣的

dbhelper = new DBHelper(this); 
int count = dbhelper.getTotalRecords(); 
+0

感謝您的提示。請記住。 :D –

+0

@ElaBuwa在您的數據庫類中創建方法將允許您在很多活動中使用它,並且在大型應用程序中您將百分之百地要求使用它。所以最好現在就養成良好的習慣,然後再學習。 –

相關問題