2016-07-01 108 views
-2
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 

public class MainActivity extends AppCompatActivity { 

SQLiteDatabase db; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    db = this.openOrCreateDatabase("Practice", MODE_PRIVATE, null); 

    db.execSQL("CREATE TABLE IF NOT EXISTS blah (subjects VARCHAR, notes VARCHAR, amount VARCHAR"); 
} 

Das Fehlerprotokoll:Android SQLite Fehler beim Erstellen einer Tabelle (VARCHAR einen Fehler verursacht)

E/SQLiteLog: (1) in der Nähe von "VARCHAR": Syntaxfehler 06-30 23.46 : 21,834 11.420-11.420/com.asd.sqltesting D/Android Runtime: 46:: 21,835 11.420-11.420/com.asd.sqltesting E/Android Runtime: Schwerwiegende Ausnahme: main Prozess: VM 06-30 23 Abschalten com .asd.sqltesting, PID: 11420 java.lang.RuntimeException: Aktivität konnte nicht gestartet werden ComponentI nfo {com.asd.sqltesting/com.asd.sqltesting.MainActivity}: android.database.sqlite.SQLiteException: in der Nähe von "VARCHAR": Syntaxfehler (Code 1):, beim Kompilieren: CREATE TABLE IF EXISTS blah (Subjekten VARCHAR stellt VARCHAR Menge VARCHAR bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2298) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2360) bei android.app.ActivityThread .access $ 800 (ActivityThread.java:144) um android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1278) bei android.os .Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:135) bei android.app.ActivityThread.main (ActivityThread.java:5221) bei java.lang.reflect .Method.invoke (native Methode) bei java.lang.reflect.Method.invoke (Method.java:372) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694) verursacht durch: android.database.sqlite.SQLiteException: in der Nähe von "VARCHAR": Syntaxfehler (Code 1):, beim Kompilieren: CREATE TABLE WENN NICHT VORHANDEN b LAH (Subjekten VARCHAR stellt VARCHAR Menge VARCHAR bei android.database.sqlite.SQLiteConnection.nativePrepareStatement (Mutter Method) bei android.database.sqlite.SQLiteConnection.acquirePreparedStatement (SQLiteConnection.java:889) bei android .database.sqlite.SQLiteConnection.prepare (SQLiteConnection.java:500) um android.database.sqlite.SQLiteSession.prepare (SQLiteSession.java:588) bei android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:58) um android.database.sqlite.SQLiteStatement . (SQLiteStatement.java:31) bei android.database.sqlite.SQLiteDatabase.executeSql (SQLiteDatabase.java:1674) bei android.database.sqlite.SQLiteDatabase.execSQL (SQLiteDatabase.java:1605) bei com. asd.sqltesting.MainActivity.onCreate (MainActivity.java:18) bei android.app.Activity.performCreate (Activity.java:5933) bei android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1105) bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java: 2251) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2360) bei android.app.ActivityThread.access $ 800 (ActivityThread.java:144) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1278) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:135) bei android.app.ActivityThread.main (ActivityThread .java: 5221) bei java.lang.reflect.Method.invoke (native Methode) bei java.lang.reflect.Method.invoke (Method.java:372) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694)

I versucht, eine Tabelle mit mehreren Spalten zu erstellen, aber das passiert weiter. Diese genaue Codezeile wird für ein anderes Projekt verwendet, der Fehler tritt jedoch beim zweiten Mal in derselben Aktivität auf.

+0

wow das war dumm .. aber danke für die Hilfe! – MrMuffins

Antwort

6

verpassten Sie das Schließen ')':

db.execSQL("CREATE TABLE IF NOT EXISTS blah (subjects VARCHAR, notes VARCHAR, amount VARCHAR);"); 

Die Größe des VARCHAR in SQLite

enter image description here

https://www.sqlite.org/syntax/type-name.html sehen ist optional.

Ihre Aussage verifizieren Sie sqlite3

$ sqlite3 
SQLite version 3.8.10.2 2015-05-20 18:17:19 
Enter ".help" for usage hints. 
Connected to a transient in-memory database. 
sqlite> CREATE TABLE IF NOT EXISTS blah (subjects VARCHAR, notes VARCHAR, amount VARCHAR); 
+0

false sql query –

4

Sie vermissen eine runde Klammer verwenden können.

Schreiben Sie Ihre Abfrage wie folgt:

db.execSQL("CREATE TABLE IF NOT EXISTS blah (subjects VARCHAR, notes VARCHAR, amount VARCHAR)"); 

Legen Sie eine ) nach amount VARCHAR

EDIT: 1

android.database.sqlite.SQLiteException: (1) in der Nähe von "VARCHAR": Syntaxfehler

Ihr Logcat zeigt diese Ausnahme an. In der Regel tritt diese Ausnahme immer dann auf, wenn Sie ein Zeichen wie , oder " oder in Ihren Fall es ist ) fehlt. Beobachten Sie Ihre Abfrage Sie zwei Öffnung runden Klammern (, Eine vor Tabelle erstellen & 2. nach blah finden. Aber es gibt nur eine schließende Klammer ) am Ende.Dies ist der Grund, ich habe vorgeschlagen, dass Sie eine ) nach amount VARCHAR hinzufügen.

+0

'VARCHAR' ist in sqlite absolut gültig und solche Spalten erhalten die 'TEXT'-Standardaffinität. – laalto

+0

Ich denke, es ist nicht standardmäßig .. Wenn ich falsch bin, korrigieren Sie mich @ laalto –

+0

https://www.sqlite.org/datatype3.html#section_3 "Wenn der deklarierte Typ der Spalte einen der Zeichenfolgen enthält" CHAR "," CLOB ", oder" TEXT ", dann hat diese Spalte die TEXT-Affinität. Beachten Sie, dass der Typ VARCHAR die Zeichenfolge" CHAR "enthält und somit TEXT-Affinität zugewiesen ist." – laalto

-1

Ihre Anfrage ist falsch, Sie das Schließen verpasst ‚)‘: Dont Datenbank in MainActicity erstellen unter Ansatz und rufen Datenbank immer über Async Aufgabe,

Best Practice verwenden SQLiteOpenHelper, direkt folgen siehe unten bolg

https://github.com/codepath/android_guides/wiki/Local-Databases-with-SQLiteOpenHelper

Beispielprojekt

Tabelle erstellen, wie unten,

Probe:

String CREATE_POSTS_TABLE = "CREATE TABLE " + TABLE_POSTS + 
      "(" + 
       KEY_POST_ID + " INTEGER PRIMARY KEY," + // Define a primary key 
       KEY_POST_USER_ID_FK + " INTEGER REFERENCES " + TABLE_USERS + "," + // Define a foreign key 
       KEY_POST_TEXT + " TEXT" + 
      ")"; 

String CREATE_USERS_TABLE = "CREATE TABLE " + TABLE_USERS + 
     "(" + 
      KEY_USER_ID + " INTEGER PRIMARY KEY," + 
      KEY_USER_NAME + " TEXT," + 
      KEY_USER_PROFILE_PICTURE_URL + " TEXT" + 
     ")"; 

db.execSQL(CREATE_POSTS_TABLE); 
db.execSQL(CREATE_USERS_TABLE); 
1

sql Abfrage ist falsch.

Correct es zuerst

db.execSQL("CREATE TABLE IF NOT EXISTS blah (subjects VARCHAR(size), notes VARCHAR(size), amount VARCHAR(size))");