2013-06-27 3 views
0

привет, я пытаюсь создать БД и затем установить значение текстового представления на основе значения, возвращаемого из базы данных. Я получаю сообщение об ошибке «SYNTAX ERROR (code1)» вот мой код.ошибка при использовании SQLITE на android

`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 »и« number »? –

+0

Вам нужно больше пробелов, похоже, что вы создаете таблицу с столбцом IDINTEGER – faffaffaff

+0

, спасибо, я исправил ошибки, вызванные пробелами. но теперь я получаю сообщение об ошибке «индекс курсора за пределами границ» в этой строке «Контакты контакты = новые контакты (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); 
} 

нечто такое, что помогает мне отследить ошибки, как это добавить попробовать/поймать блок и бросить свое собственное исключение, которое включает в себя сгенерированным 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 Контакты контакты = новые Контакты (Integer.parseInt (c.getString (0)), c.getString (1), c.getString (2)); ' –

Смежные вопросы