2014-12-09 154 views
-1

我想創建一個本地數據庫在Android SQLite,但每次我嘗試創建我在我的logcat上得到這個異常,爲什麼發生這種情況?我已經刪除的應用程序,並運行作爲一個新的...無法創建本地數據庫SQLite

private static final int DATABASE_VERSAO = 1; 
public static final String DATABASE_NAME = "STARA_DB"; 

private static final String TB_CLIENTE = "Table de Clientes"; 

private final Context context; 
private DatabaseHelper DBHelper; 
private SQLiteDatabase database; 
private static final String TAG = "DBAdapter"; 

String TabelaClientes = "CREATE TABLE " 
     + TB_CLIENTE 
     + "(ID_CLIENTE PRIMARY KEY NOT NULL AUTOINCREMENT, " 
     + "KUNNR TEXT, " 
     + "NAME1 TEXT);"; 

public ClienteDAO(Context ctx) { 
    this.context = ctx; 
    DBHelper = new DatabaseHelper(context); 
} 

private class DatabaseHelper extends SQLiteOpenHelper { 
    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSAO); 
    } 

    public void onCreate(SQLiteDatabase database) { 
     try { 
      database.execSQL(TB_CLIENTE); 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { 
     Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); 

     database.execSQL("DROP TABLE IF EXISTS" + TB_CLIENTE); 
     // onCreate(database); 
     onUpgrade(database, oldVersion, newVersion); 
    } 
public long insertCliente(String KUNNR, String NAME1) { 
    ContentValues initialValuesClientes = new ContentValues(); 
    initialValuesClientes.put("KUNNR", KUNNR); 
    initialValuesClientes.put("NAME1", NAME1); 

    return database.insert(TB_CLIENTE, null, initialValuesClientes); 
} 
public List<ClienteModelo> getListaClientes() { 

    List<ClienteModelo> clientes = new ArrayList<ClienteModelo>(); 

    Cursor cCli = DBHelper.getReadableDatabase().rawQuery("Select KUNNR, NAME1 from " + TB_CLIENTE + ";", null); 

    while (cCli.moveToNext()) { 
     ClienteModelo cliente = new ClienteModelo(); 

     // cliente.setClienteID(cCli.getLong(cCli.getColumnIndex("ID_CLIENTE"))); 
     cliente.setKunnr(cCli.getString(cCli.getColumnIndex("KUNNR"))); 
     cliente.setName1(cCli.getString(cCli.getColumnIndex("NAME1"))); 

     clientes.add(cliente); 
    } 

    cCli.close(); 
    return clientes; 

} 

public void deleteCliente() { 
    database.delete(TB_CLIENTE, null, null); 
} 

和消息上的logcat:

no such table: TABLE_CLIENTE 
java.lang.RuntimeException: Unable to start activity ComponentInfo{stara.formularios/stara.formularios.views.FormNota}: android.database.sqlite.SQLiteException: no such table: TABLE_CLIENTE (code 1): , while compiling: Select KUNNR, NAME1 from TABLE_CLIENTE; 
Caused by: android.database.sqlite.SQLiteException: no such table: TABLE_CLIENTE (code 1): , while compiling: Select KUNNR, NAME1 from TABLE_CLIENTE;" 
+0

你可能想要卸載並重新安裝你的應用程序。 – DroidDev 2014-12-09 13:26:36

+0

不應該在您的onCreate中使用database.execSQL(TB_CLIENTE)作爲database.execSQL(TabelaClientes)嗎? – 2014-12-09 13:28:37

回答

5

您的CREATE TABLE被您忽略的語法錯誤。

  • "Table de Clientes"大概應該是這樣"TABLE_CLIENTE"你使用後,根據自己的堆棧跟蹤一個有效的標識符。

  • ID_CLIENTE PRIMARY KEY NOT NULL AUTOINCREMENT需要其中有INTEGER,例如, ID_CLIENTE INTEGER PRIMARY KEY AUTOINCREMENTNOT NULL是多餘的;主鍵不能爲空。

  • 您需要將SQL而不是表名稱傳遞給execSQL()

  • 在您的onCreate()中刪除try - catch。回調需要拋出錯誤,而不是忽略問題。

更改後,卸載您的應用程序,以便舊數據庫文件被刪除。

+0

非常感謝我的解釋,我不是很瞭解... – 2014-12-09 13:39:29

1

在OnCreate中你傳遞錯誤的參數來創建表:

public void onCreate(SQLiteDatabase database) { 
     try { 
      database.execSQL(TabelaClientes); 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

和表名不能包含任何空格。

private static final String TB_CLIENTE = "Table_de_Clientes"; 
+0

非常感謝解釋我不理解,... – 2014-12-09 13:41:00