2016-02-02 119 views
0

我在使用SQLite和在我的Android应用程序内创建数据库时遇到问题。我希望这里有人能够指出我刚刚尝试创建数据库时出现的问题。下面是代码:如何在Android应用程序内执行SQLite数据库

内DBContract类:

public final class DBContract { 

public DBContract() { }  

public static abstract class DBEntry implements BaseColumns { 

    public static final String TABLE_WORKOUTS = "Workouts"; 
    public static final String ENTRY_ID = "id"; 
    public static final String ENTRY_NAME = "Exercise"; 
    public static final String ENTRY_DESCRIPTION = "Description"; 
    public static final String ENTRY_SETS = "Sets"; 
    public static final String ENTRY_REPS = "Reps"; 
    public static final String ENTRY_WEIGHT = "Weight"; 


} 

private static final String TEXT_TYPE = "TEXT"; 
private static final String COMMA_SEP = ","; 
private static final String SQL_CREATE_ENTRIES = 
     "CREATE TABLE " + DBEntry.TABLE_WORKOUTS + " (" + 
       DBEntry.ENTRY_ID + " INTEGER PRIMARY KEY," + 
       DBEntry.ENTRY_NAME + TEXT_TYPE + COMMA_SEP + 
       DBEntry.ENTRY_DESCRIPTION + TEXT_TYPE + COMMA_SEP + 
       DBEntry.ENTRY_SETS + TEXT_TYPE + COMMA_SEP + 
       DBEntry.ENTRY_REPS + TEXT_TYPE + COMMA_SEP + 
       DBEntry.ENTRY_WEIGHT + TEXT_TYPE + ")"; 

private static final String SQL_DELETE_ENTRIES = 
     "DROP TABLE IF EXISTS " + DBEntry.TABLE_WORKOUTS; 


public static class DBHelper extends SQLiteOpenHelper { 

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

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

    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_ENTRIES); 
    } 

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // This database is only a cache for online data, so its upgrade policy is 
     // to simply to discard the data and start over 
     db.execSQL(SQL_DELETE_ENTRIES); 
     onCreate(db); 
    } 

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     onUpgrade(db, oldVersion, newVersion); 
    } 
    } 
} 

这是我做的尝试访问数据库:

public class MainActivity extends AppCompatActivity { 

private BluetoothAdapter mBluetoothAdapter; 
private BroadcastReceiver mReceiver; 
private BluetoothSocket mmSocket; 

private static int REQUEST_ENABLE_BT = 1; 
private int hc05Index; 
private String hc05Address; 
private int numOfReadBytes; 
private int readBuffer; 
private ArrayList<String> deviceNameList = new ArrayList<String>(); 
private ArrayList<String> deviceAddressList = new ArrayList<String>(); 

DBContract.DBHelper mDBHelper = new DBContract.DBHelper(getBaseContext()); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    SQLiteDatabase db = mDBHelper.getWritableDatabase(); 

注:我切断的onCreate其余()函数的主要活动,以免添加不必要的代码来滚动浏览。

所以主要活动内创建我DBHelper类的实例和主要活动的OnCreate函数中我所说的getWriteableDatabase()函数要么得到一个现有的数据库或创建一个新的,如果它一直没有创建。我的理解是这个函数会调用我的DBHelper类的onCreate()函数,它应该执行写入的创建表SQL命令并创建数据库。出于某种原因,getWriteableDatabase()函数迫使应用程序关闭。

任何帮助将不胜感激!

在此先感谢!

编辑:这里是日志:

02-01 22:04:48.681 21782-21782/com.example.rpholmes.digibottle E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.rpholmes.digibottle, PID: 21782 
                      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.rpholmes.digibottle/com.example.rpholmes.digibottle.MainActivity}: java.lang.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 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5417) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                       Caused by: java.lang.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 
                       at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) 
                       at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
                       at com.example.rpholmes.digibottle.MainActivity.onCreate(MainActivity.java:45) 
                       at android.app.Activity.performCreate(Activity.java:6237) 
                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
                       at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:148)  
                       at android.app.ActivityThread.main(ActivityThread.java:5417)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

02-01 22:04:48.705 21782-21782 /?我/过程:发送信号。 PID:21782 SIG:9

+0

发布您的日志语句。 –

+0

添加错误日志 – RupaRupa

+0

检查日志:位置com.example.rpholmes.digibottle.MainActivity.onCreate存在空指针异常(MainActivity.java:45) –

回答

0

SQL查询需要适当的白色间距。 修改以下行DBContract为...

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

(请发表您的日志报表,如果错误仍然存​​在)

+0

@Shahzar_Ahmed我试图做出这些改变,错误持续存在。我添加了日志文件供您查看。还有什么建议? – RupaRupa

+0

@Shahzar_Ahmed我将此语句移到了主Activity onCreate()函数中,似乎没问题。 DBContract.DBHelper mDBHelper = new DBContract.DBHelper(this.getBaseContext()); – RupaRupa

0

你想创建表的前面插入值,尝试添加SQLiteDatabase分贝= mDBHelper.getWritableDatabase();仅在DBHelper类中。 这样就可以完成表格插入的创建。

public void InsertValues(){ 
     db =this.getWritableDatabase(); 
     ContentValues cv = new ContentValues(); 
     cv.put(DBEntry.ENTRY_NAME,"adc"); 
    } 
相关问题