2013-06-27 25 views
0

您好我想創建一個數據庫,然後根據從數據庫返回的值設置文本視圖值。我收到一個錯誤「SYNTAX ERROR(code1)」 這裏是我的代碼。錯誤,同時在Android上使用SQLITE

`package com.example.dbex; 

import java.sql.SQLOutput; 
import java.sql.SQLPermission; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DBHandler extends SQLiteOpenHelper { 

    public static final int DATABASE_VERSION=1; 
    public static final String DATABASE_NAME="contactsmanager"; 
    public static final String TABLE_CONTACTS="contacts"; 
    public static final String KEY_ID="id"; 
    public static final String KEY_NAME="name"; 
    public static final String KEY_NUMBER="number"; 
    public DBHandler(Context context) { 
     super(context,DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     String CREATE_TABLE_CONTACTS="CREATE TABLE"+TABLE_CONTACTS+"("+KEY_ID+"INTEGER PRIMARY KEY,"+KEY_NAME+"TEXT,"+KEY_NUMBER+"TEXT"+")"; 
     db.execSQL(CREATE_TABLE_CONTACTS); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS"+TABLE_CONTACTS); 
     onCreate(db); 
    } 

    public void addContact(Contacts contacts) 
    { 
     SQLiteDatabase db=this.getWritableDatabase(); 
     ContentValues values=new ContentValues(); 
     values.put(KEY_NAME, contacts.getname()); 
     values.put(KEY_NUMBER, contacts.getnumber()); 
     db.insert(TABLE_CONTACTS,null,values); 
     db.close(); 
    } 

    public Contacts getContact(int id) 
    { 
     SQLiteDatabase db=this.getReadableDatabase(); 
     Cursor c=db.query(TABLE_CONTACTS, new String[]{KEY_ID,KEY_NAME,KEY_NUMBER},KEY_ID+"=?",new String[]{String.valueOf(id)}, null, null, null, null); 
     if(c!=null) 
     { 
      c.moveToFirst(); 
     } 
     Contacts contacts=new Contacts(Integer.parseInt(c.getString(0)),c.getString(1),c.getString(2)); 
     return contacts; 
    } 

    public void deleteContact(Contacts contacts) 
    { 
     SQLiteDatabase db=this.getWritableDatabase(); 
     db.delete(TABLE_CONTACTS, KEY_ID+"=?", new String[]{String.valueOf(contacts.getID())}); 
     ``db.close(); 
    } 


} 
` 

請幫我糾正一下我的錯誤。 感謝

回答

0

「如果存在刪除表」你還需要「創建表」和之後的空間:

"create table " 
"drop table if exists " 
+0

謝謝。我已經這樣做了,但我現在得到一個錯誤,說有沒有這樣的列'id'和'數字'「? –

+0

你需要更多的空間,它看起來像你正在創建一個名爲IDINTEGER – faffaffaff

+0

列的表謝謝,我已經修復了由於空間造成的錯誤。但現在我在這一行上得到一個錯誤「光標索引超出界限」Contacts contacts = new Contacts(Integer.parseInt(c.getString(0)),c.getString(1),c.getString(2)) ;' –

1

您需要在SQL中的空間,在你onUpgrade方法:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 
    db.execSQL("DROP TABLE IF EXISTS "+TABLE_CONTACTS); 
    onCreate(db); 
} 

目前執行的SQL是: DROP TABLE IF EXISTScontacts

它需要是: DROP TABLE IF EXISTS contacts

這也適用於一些地方在你onCreate方法:

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    String CREATE_TABLE_CONTACTS="CREATE TABLE "+TABLE_CONTACTS+"("+KEY_ID+" INTEGER PRIMARY KEY,"+KEY_NAME+" TEXT,"+KEY_NUMBER+" TEXT"+")"; 
    db.execSQL(CREATE_TABLE_CONTACTS); 
} 

一些東西,可以幫助我追查象這樣的錯誤是將一個try/catch塊,並拋出自己的異常包含所生成SQL,例如:

@Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     String CREATE_TABLE_CONTACTS="CREATE TABLE "+TABLE_CONTACTS+"("+KEY_ID+" INTEGER PRIMARY KEY,"+KEY_NAME+" TEXT,"+KEY_NUMBER+" TEXT"+")"; 
try { 
     db.execSQL(CREATE_TABLE_CONTACTS); 
} catch (SQLException sqlException) { 
throw new SQLException("Error executing SQL: '" + CREATE_TABLE_CONTACTS + "', message: " + sqlException.getMessage(), sqlException); 
} 
    } 

這允許您查看錯誤消息以及導致它的SQL。如果您這樣做,建議您創建包含此代碼的自己的execSQL方法。你甚至可以創建自己的包裝SQLiteDatabase,並將此邏輯添加到您自己的覆蓋execSQL

+0

謝謝,我修復了由於空格造成的錯誤。但現在我在這條線上收到錯誤「遊標索引越界」\t \t聯繫人contacts =新聯繫人(Integer.parseInt(c.getString(0)),c.getString(1),c.getString(2 ));' –