2015-02-12 134 views
-1

我正在嘗試向SQLite數據庫輸入一些數據,並且每次嘗試添加數據時都會收到錯誤消息。插入數據的Android SQLite錯誤

錯誤消息
這裏是LOG:Error Log

輸出

02-11 18:36:36.050 1853-1872/com.teamnewb.sahil.bliss D/OpenGLRenderer﹕ endAllStagingAnimators on 0x7f851d267800 (RippleDrawable) with handle 0x7f851d25da40 
02-11 18:36:37.680 1853-1853/com.teamnewb.sahil.bliss E/SQLiteLog﹕ (1) near ".": syntax error 
    --------- beginning of crash 
02-11 18:36:37.700 1853-1853/com.teamnewb.sahil.bliss E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.teamnewb.sahil.bliss, PID: 1853 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.teamnewb.sahil.bliss/com.teamnewb.sahil.bliss.ActionSummary}: android.database.sqlite.SQLiteException: near ".": syntax error (code 1): , while compiling: CREATE TABLE tasks (com.teamnewb.sahil.TaskContract.TASKDESC TEXT) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: android.database.sqlite.SQLiteException: near ".": syntax error (code 1): , while compiling: CREATE TABLE tasks (com.teamnewb.sahil.TaskContract.TASKDESC TEXT) 
      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
      at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
      at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674) 
      at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605) 
      at db.TaskDBHelper.onCreate(TaskDBHelper.java:28) 
      at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251) 
      at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
      at db.TaskCRUD.insert(TaskCRUD.java:22) 
      at com.teamnewb.sahil.bliss.ActionSummary.onCreate(ActionSummary.java:63) 
      at android.app.Activity.performCreate(Activity.java:5933) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
02-11 18:36:39.400 1897-1897/com.teamnewb.sahil.bliss D/addEventYet﹕ false 
02-11 18:36:39.400 1897-1897/com.teamnewb.sahil.bliss D/Db is empty?﹕ Yes 

TaskContract.java

package db; 

    import android.provider.BaseColumns; 

    import java.util.Calendar; 

public class TaskContract { 
    public static final String DB_NAME = "com.teamnewb.sahil.db.tasks"; 
    public static final int DB_VERSION = 1; 
    public static final String TABLE = "tasks"; 



public static class Columns { 
    public static final String TASKDESC = "taskdesc"; //TODO: get task description input here and other inputs as well 
    public static final String DATEMONTH = "month"; 
    public static final String DATEDAY = "day"; 
    public static final String DATEYEAR = "year"; 
    public static final String TASKTYPE = "tasktype"; 
    public static final String IMP = "imp"; 

    //Variables used to transfer/store data 
    public String description; 
    public String type; //note if completed task store as COMPLETEDTASK 
    public int year; 
    public int month; 
    public int day; 
    public int im; //0 = not important, else 1 

    public Columns(String d, String t, int i) { 
     description = d; 
     type = t; 
     im = i; 
     Calendar cal = Calendar.getInstance(); 
     year = cal.get(Calendar.YEAR); 
     day = cal.get(Calendar.DAY_OF_MONTH); 
     month = Calendar.MONTH; 
    } 

    } 

    } 

TaskDBHelper.java

package db; 


import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

    public class TaskDBHelper extends SQLiteOpenHelper { 

public TaskDBHelper(Context context) { 
    super(context, TaskContract.DB_NAME, null, TaskContract.DB_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase sqlDB) { 
    String sqlQuery = "CREATE TABLE " + TaskContract.TABLE + "(" + TaskContract.Columns.TASKDESC + "TEXT, " 
      + TaskContract.Columns.TASKTYPE + "TEXT, " + TaskContract.Columns.DATEYEAR + "INTEGER, " + 
      TaskContract.Columns.DATEMONTH + "INTEGER, " + TaskContract.Columns.DATEDAY + "INTEGER, " 
      + TaskContract.Columns.IMP + "INTEGER)"; 


    Log.d("TaskDBHelper", "Query to form table: " + sqlQuery); 
    sqlDB.execSQL(sqlQuery); 
} 

@Override 
public void onUpgrade(SQLiteDatabase sqlDB, int i, int i2) { 
    sqlDB.execSQL("DROP TABLE IF EXISTS " + TaskContract.TABLE); 
    onCreate(sqlDB); 
    } 
} 

TaskCRUD.java

package db; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import java.util.ArrayList; 
import java.util.HashMap; 
import android.util.Log; 
public class TaskCRUD { 
private TaskDBHelper dbHelper; 

public TaskCRUD (Context context) 
{ 
    dbHelper = new TaskDBHelper(context); 
} 

public boolean insert(TaskContract.Columns c) 
{ 
    SQLiteDatabase db = dbHelper.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(TaskContract.Columns.DATEDAY, c.day); 
    Log.d(TaskContract.Columns.DATEDAY, c.day + ""); 
    values.put(TaskContract.Columns.DATEMONTH, c.month); 
    Log.d(TaskContract.Columns.DATEMONTH, c.month + ""); 
    values.put(TaskContract.Columns.DATEYEAR, c.year); 
    Log.d(TaskContract.Columns.DATEYEAR, c.year + ""); 
    values.put(TaskContract.Columns.TASKDESC, c.description); 
    Log.d(TaskContract.Columns.TASKDESC, c.description); 
    values.put(TaskContract.Columns.TASKTYPE, c.type); 
    Log.d(TaskContract.Columns.TASKTYPE, c.type); 
    values.put(TaskContract.Columns.IMP, c.im); 
    Log.d(TaskContract.Columns.IMP, c.im + ""); 
    db.insertWithOnConflict(TaskContract.TABLE,null,values,SQLiteDatabase.CONFLICT_IGNORE); 
    return true; 
} 

public boolean delete(String description) 
{ 
    SQLiteDatabase db = dbHelper.getWritableDatabase(); 
    // It's a good practice to use parameter ?, instead of concatenate string 
    db.delete(TaskContract.TABLE, description + "= ?", new String[] { String.valueOf(description) }); 
    db.close(); // Closing database connection 
    return true; 
} 
public ArrayList<Tasks> getData(int m, int y) { 
    ArrayList<Tasks> t = new ArrayList<Tasks>(); 
    SQLiteDatabase db = dbHelper.getWritableDatabase(); 

     String q = "SELECT * FROM " + TaskContract.TABLE + " WHERE " + 
       TaskContract.Columns.DATEMONTH + " = " + m + " AND " + TaskContract.Columns.DATEYEAR + " = " + y + " ORDER BY " 
       + TaskContract.Columns.DATEDAY + " DESC;"; 
     Cursor c = db.rawQuery(q, null); 
     c.moveToFirst(); 
    if (c != null) 
    { 
     do { 
      String desc = c.getString(0); 
      String type = c.getString(1); 
      int year = Integer.parseInt(c.getString(3)); 
      int month = Integer.parseInt(c.getString(4)); 
      int day = Integer.parseInt(c.getString(5)); 
      int imp = Integer.parseInt(c.getString(6)); 
      Tasks task = new Tasks(day, month, year, imp, desc, type); 
      t.add(task); 
     } while (c.moveToNext()); 
     return t; 
    } 
    else 
    { 
     return null; 
    } 
    } 

} 
+0

將版本代碼'DB_VERSION = 1;'更改爲'DB_VERSION = 2;' – 2015-02-12 02:59:20

+0

後無法正常工作。任何其他的想法傢伙? – Spriggs857 2015-02-12 03:13:49

+0

我想你最後錯過了一個分號。如下:\t \t \t「CREATE TABLE IF NOT EXISTS sale(isfav TEXT,ishidden TEXT,sale_id TEXT);」; – kgandroid 2015-02-12 05:17:56

回答

0

考慮更改DB_NAME爲類似tasks.db。您的錯誤可能與DB_NAME有關。

另外,修改您的表create語句以在列名聲明之後和聲明列數據類型之前包含空格。

String sqlQuery = "CREATE TABLE " + TaskContract.TABLE + " (" + TaskContract.Columns.TASKDESC + " TEXT, " 
      + TaskContract.Columns.TASKTYPE + " TEXT, " + TaskContract.Columns.DATEYEAR + " INTEGER, " + 
      TaskContract.Columns.DATEMONTH + " INTEGER, " + TaskContract.Columns.DATEDAY + " INTEGER, " 
      + TaskContract.Columns.IMP + " INTEGER)"; 

讓我知道這是否有幫助。