由于语法错误SQLite数据库强制关闭

问题描述:

我试图插入到SQLite数据库,但它每次我在模拟器上运行我的程序时强制关闭。我认为它有我的数据库创建的语法应有的东西,但我有三重检查它,并找不到我的错误。我唯一能想到的其他事情是如果我必须向清单中添加某些内容以正确运行SQlite数据库。由于语法错误SQLite数据库强制关闭

下面是我的帮手类的代码。

public class dbhelper extends SQLiteOpenHelper { 

    public static final String DATABASE_NAME = "swimmers"; 
    public static final String TABLE_SWIMMERS = "sfd table"; 

    public static final String C_ID = "id"; 
    public static final String NAME = "name"; 
    public static final String TEAM = "team"; 
    public static final String NOTES = "notes"; 

    public static final int VERSION = 1; 

    public dbhelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, VERSION); 
    } 

    @Override 
    public void onCreate (SQLiteDatabase db) 
    { 
     String createdb = "create table " + TABLE_SWIMMERS + "(" + C_ID + " integer primary key autoincrement, " + NAME + " text, " + TEAM + " text, " + NOTES + " text); "; 
     db.execSQL(createdb); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     db.execSQL("drop table " + TABLE_SWIMMERS); 
     onCreate(db); 
    } 

    //add new entry 
    void addSwimmer(Swimmer swimmer){ 

     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 

     values.put(NAME, swimmer.getname()); 
     values.put(TEAM, swimmer.getteam()); 
     values.put(NOTES, swimmer.getnotes()); 

     db.insert(TABLE_SWIMMERS, null, values); 
     db.close(); 
    } 

    //Getting single swimmer 
    Swimmer getSwimmer(int id){ 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(TABLE_SWIMMERS, new String[] { C_ID, NAME, TEAM, NOTES}, C_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null); 
     if (cursor !=null) 
      cursor.moveToFirst(); 

     Swimmer swimmer = new Swimmer (Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), null); 
     return swimmer; 
    } 

    public int updateSwimmer(Swimmer swimmer){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 

     values.put(NAME, swimmer.getname()); 
     values.put(TEAM, swimmer.getteam()); 
     values.put(NOTES, swimmer.getnotes()); 

     return db.update(TABLE_SWIMMERS, values, C_ID + " = ?", new String[] { String.valueOf(swimmer.getID()) });   
    } 

    //delete single contact 
    public void deleteSwimmer(Swimmer swimmer){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_SWIMMERS, C_ID + " = ?", new String[] { String.valueOf(swimmer.getID()) });   
     db.close(); 
    } 

    //get contacts count 
    public int getSwimmersCount(){ 
     String countQuery = "SELECT * FROM " + TABLE_SWIMMERS; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     cursor.close(); 
     return cursor.getCount(); 
    } 

} 

下面是我所做的Swimmer类,我试图将一个Swimmer插入到数据库中。

public class Swimmer { 

//private variables 
int _id; 
String _name; 
String _team; 
String _notes; 


public Swimmer(int id, String name, String team, String notes){ 
    this._id = id; 
    this._name = name; 
    this._team = team; 
    this._notes = notes; 
} 

public Swimmer(String name, String team, String notes){ 
    this._name = name; 
    this._team = team; 
    this._notes = notes; 
} 

public int getID(){ 
    return this._id; 
} 

public void setID(int id){ 
    this._id = id; 
} 

public String getname(){ 
    return this._name; 
} 

public void setname(String name){ 
    this._name = name; 
} 

public String getteam(){ 
    return this._team; 
} 

public void setteam(String team){ 
    this._team = team; 
} 

public String getnotes(){ 
    return this._notes; 
} 

public void setnotes(String notes){ 
    this._notes = notes; 
} 
} 

这里是我的代码打开并插入数据库。

public class CreateNewSwimmerProfile extends Activity { 

private dbhelper db; 

private final String TAG = "Create New Profile"; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{  
     getMenuInflater().inflate(R.menu.activity_sfdmain, menu); 
     return true; 
    } 

@Override 

public void onCreate (Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    Log.i("createProfileActivity", "Intent Text"); 

    setContentView(R.layout.createprofile); 
    Intent createprofileintent = getIntent(); 
    db = new dbhelper(this); 
} 

public void btn_CLICK_addswimmer (View w) 
{ 
    Log.i("Insert: ", "Inserting ..");  

    String name,team,notes; 

    EditText nameIn = (EditText) findViewById(R.id.editText_name); 
    EditText teamIn = (EditText) findViewById(R.id.editText_team); 
    EditText notesIn = (EditText) findViewById(R.id.editText_notes); 

    name = nameIn.getText().toString(); 
    team = teamIn.getText().toString(); 
    notes = notesIn.getText().toString(); 

    Swimmer test = new Swimmer(name, team, notes); 
    db.addSwimmer(test); 
} 

public void btn_CLICK_cancel (View b) 
{ 
     Log.i(TAG, "start create new profile activity"); 
     Intent intent = new Intent(this, SFDMain.class); 
     startActivity(intent); 
} 

} 

这里是我的错误,当我尝试插入游泳者。

11-27 08:58:36.150: E/AndroidRuntime(643): FATAL EXCEPTION: main 
11-27 08:58:36.150: E/AndroidRuntime(643): java.lang.IllegalStateException: Could not  execute method of the activity 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.view.View$1.onClick(View.java:3591) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.view.View.performClick(View.java:4084) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.view.View$PerformClick.run(View.java:16966) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.os.Handler.handleCallback(Handler.java:615) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.os.Looper.loop(Looper.java:137) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.app.ActivityThread.main(ActivityThread.java:4745) 
11-27 08:58:36.150: E/AndroidRuntime(643): at                   java.lang.reflect.Method.invokeNative(Native Method) 
11-27 08:58:36.150: E/AndroidRuntime(643): at java.lang.reflect.Method.invoke(Method.java:511) 
11-27 08:58:36.150: E/AndroidRuntime(643): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
11-27 08:58:36.150: E/AndroidRuntime(643): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-27 08:58:36.150: E/AndroidRuntime(643): at dalvik.system.NativeStart.main(Native Method) 
11-27 08:58:36.150: E/AndroidRuntime(643): Caused by: java.lang.reflect.InvocationTargetException 
11-27 08:58:36.150: E/AndroidRuntime(643): at java.lang.reflect.Method.invokeNative(Native Method) 
11-27 08:58:36.150: E/AndroidRuntime(643): at java.lang.reflect.Method.invoke(Method.java:511) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.view.View$1.onClick(View.java:3586) 
11-27 08:58:36.150: E/AndroidRuntime(643): ... 11 more 
11-27 08:58:36.150: E/AndroidRuntime(643): Caused by: android.database.sqlite.SQLiteException: near "table": syntax error (code 1): , while compiling: create table sfd table(id integer primary key autoincrement, name text, team text, notes text); 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594) 
11-27 08:58:36.150: E/AndroidRuntime(643): at com.sfd.swimming.feedback.display.system.dbhelper.onCreate(dbhelper.java:35) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
11-27 08:58:36.150: E/AndroidRuntime(643): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
11-27 08:58:36.150: E/AndroidRuntime(643): at com.sfd.swimming.feedback.display.system.dbhelper.addSwimmer(dbhelper.java:48) 
11-27 08:58:36.150: E/AndroidRuntime(643): at com.sfd.swimming.feedback.display.system.CreateNewSwimmerProfile.btn_CLICK_addswimmer(CreateNewSwimmerProfile.java:50) 
11-27 08:58:36.150: E/AndroidRuntime(643): ... 14 more 
11-27 08:58:36.420: D/dalvikvm(643): GC_CONCURRENT freed 207K, 4% free 8241K/8519K, paused 22ms+33ms, total 304ms 
11-27 08:58:38.680: I/Process(643): Sending signal. PID: 643 SIG: 9 

任何帮助非常感谢!

表是SQLite的关键字。尝试将您的变量TABLE_SWIMMERS从TABLE_SWIMMERS = "sfd table";更改为TABLE_SWIMMERS = "sfd";,它将起作用。

+0

非常感谢!它的工作原理:)现在,我试图编写一个活动,首先显示游泳者的名字,然后当你点击该名称时,它会显示游泳者信息的其余部分。 – user1855195

+0

你有什么建议从哪里开始? – user1855195

+0

我想我会产生两个单独的活动,第一个带有ListView,带有一个onclick事件传递一个带有swimmerobject参数的第二个活动,您可以在其中显示游泳信息的其余部分。 –