2014-01-29 39 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在您的数据库类中创建方法将允许您在很多活动中使用它,并且在大型应用程序中您将百分之百地要求使用它。所以最好现在就养成良好的习惯,然后再学习。 –

相关问题