2013-06-30 4 views
0

Я разрабатываю отслеживание расходов, где хочу заполнить БД несколькими записями, когда приложение запускается первым. Я попытался вызвать метод в моей активности всплеска и добавить данные.! Но когда я очищаю данные приложения и запускаю приложение в первый раз, возникает ошибка, говоря, что такого столбца нет.Вставить исходные данные в sql lite android

Ошибка log cat, как показано ниже.

06-30 18:09:58.834: E/SQLiteLog(18380): (1) no such column: exp_type 
06-30 18:10:00.826: D/AndroidRuntime(18380): Shutting down VM 
06-30 18:10:00.826: W/dalvikvm(18380): threadid=1: thread exiting with uncaught exception (group=0x416b8318) 
06-30 18:10:00.856: E/AndroidRuntime(18380): FATAL EXCEPTION: main 
06-30 18:10:00.856: E/AndroidRuntime(18380): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sliit.expenseanalyzer/com.sliit.expenseanalyzer.SplashActivity}: android.database.sqlite.SQLiteException: no such column: exp_type (code 1): , while compiling: SELECT * FROM expense_type Order BY exp_type DESC 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2063) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.app.ActivityThread.access$600(ActivityThread.java:134) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.os.Looper.loop(Looper.java:137) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.app.ActivityThread.main(ActivityThread.java:4744) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at java.lang.reflect.Method.invokeNative(Native Method) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at java.lang.reflect.Method.invoke(Method.java:511) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at dalvik.system.NativeStart.main(Native Method) 
06-30 18:10:00.856: E/AndroidRuntime(18380): Caused by: android.database.sqlite.SQLiteException: no such column: exp_type (code 1): , while compiling: SELECT * FROM expense_type Order BY exp_type DESC 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at com.sliit.expenseanalyzer.util.DatabaseHandler.getAllExpenseTypes(DatabaseHandler.java:218) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at com.sliit.expenseanalyzer.SplashActivity.onCreate(SplashActivity.java:29) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.app.Activity.performCreate(Activity.java:5008) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
06-30 18:10:00.856: E/AndroidRuntime(18380): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2027) 
06-30 18:10:00.856: E/AndroidRuntime(18380): ... 11 more 

Как я могу заполнить данные, когда приложение запускается в первый раз! Это всего лишь несколько записей, поэтому я не беспокоюсь о производительности.

Было бы очень полезно!

спасибо.

DATABASE КОД

public void onCreate(SQLiteDatabase db) { 

     // Create user table 
     String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + "(" + KEY_ID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_NAME + " TEXT," 
       + KEY_EMAIL + " TEXT," + KEY_PW + " TEXT," + KEY_SESSION 
       + " INTEGER" + ")"; 

     String CREATE_EXPENSE_TYPE_TABLE = "CREATE TABLE " + TABLE_EXPENSE_TYPE 
       + " (" + KEY_EXPENSE_ID + " INTEGER AUTOINCREMENT" + KEY_EXPENSE_TYPE + " TEXT PRIMARY KEY" + ")"; 

     db.execSQL(CREATE_USER_TABLE); 
     db.execSQL(CREATE_EXPENSE_TYPE_TABLE); 
    } 

метод я использую для добавления записей

public Long addExpenseType(String expense) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_EXPENSE_TYPE, expense); 

     Long row = db.insert(TABLE_EXPENSE_TYPE, null, values); 
     db.close(); 

     return row; 
    } 

строковые значения:

private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "expenseManager"; 

    // Database Tables 
    private static final String TABLE_USER = "user"; 
    private static final String TABLE_EXPENSE_TYPE = "expense_type"; 

    // User table columns 
    private static final String KEY_ID = "id"; 
    private static final String KEY_NAME = "full_name"; 
    private static final String KEY_PW = "password"; 
    private static final String KEY_EMAIL = "email"; 
    private static final String KEY_SESSION = "session"; 

    // Expense type table columns 
    private static final String KEY_EXPENSE_ID = "id"; 
    private static final String KEY_EXPENSE_TYPE = "exp_type"; 
+0

Просьба включить соответствующий код. –

+0

проверьте код создания таблицы. кажется, вы пытаетесь получить доступ к неправильному столбцу – stinepike

+0

Я думаю, что он просит код создания таблицы –

ответ

3

Сделайте привычку хорошо форматировать свой код. Последнее определение столбца не имеет запятой:

String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER 
      + "(" 
      + KEY_ID  + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + KEY_NAME + " TEXT, " 
      + KEY_EMAIL + " TEXT, " 
      + KEY_PW  + " TEXT, " 
      + KEY_SESSION + " INTEGER " 
      + ")"; 

    String CREATE_EXPENSE_TYPE_TABLE = "CREATE TABLE " + TABLE_EXPENSE_TYPE 
      + "(" 
      + KEY_EXPENSE_ID + " INTEGER AUTOINCREMENT, " 
      + KEY_EXPENSE_TYPE + " TEXT PRIMARY KEY " 
      + ")"; 
+0

это запятая, которая отсутствовала! –

2

android.database.sqlite.SQLiteException: no such column: exp_type (code 1): , while compiling: SELECT * FROM expense_type Order BY exp_type DESC

Это ваша ошибка:

String CREATE_EXPENSE_TYPE_TABLE = "CREATE TABLE " + TABLE_EXPENSE_TYPE 
       + " (" + KEY_EXPENSE_ID + " INTEGER AUTOINCREMENT" + 
    KEY_EXPENSE_TYPE + " TEXT PRIMARY KEY" + ") 

Вам нужен пробел после INTEGER AUTOINCREMENT

KEY_EXPENSE_ID + " INTEGER AUTOINCREMENT" + 
     KEY_EXPENSE_TYPE 

вычисляет:

"Идентификатор целое autoincrementexp_type"

+0

он должен иметь, так как я создаю таблицу в классе обработчика базы данных! –

+0

@DimalChandrasiri Я не вижу любой код в вашей инструкции create, ссылающийся на значение exp_type. Все, что вы указали, является ссылкой на константные строки, а не на значения этих строк. – Woot4Moo

+0

Я добавил строки, извините за то, что не добавлял их на первое место! –

2

пытаются добавить флаг в вашем user preferences/shared preferences для проверки приложений первый запуск, а затем по возвращении вы можете решить, хотите ли вы создать свой дБ или прочитать его!
посмотрите здесь http://www.vogella.com/articles/AndroidSQLite/article.html
EDIT
или просто проверить, если dbexists вместо пользователя прив флаг

1
private final String SAMPLE_DB_NAME = "TheftData"; 
    private final String SAMPLE_TABLE_NAME = "UserDetails"; 
    String CreateTable = "CREATE TABLE IF NOT EXISTS " + 
      SAMPLE_TABLE_NAME + 
      " (Username VARCHAR, Password VARCHAR," +     
      ");"; 

Тогда в OnCreate

protected void onCreate(Bundle savedInstanceState) { 
try { 
     sampleDB = this.openOrCreateDatabase(SAMPLE_DB_NAME, MODE_PRIVATE, null); 

     sampleDB.execSQL(CreateTable); 
     sampleDB.close(); 
     } 

    catch(Exception e) 
    {Toast.makeText(getApplicationContext(), " Error: "+e.getMessage(), Toast.LENGTH_LONG).show(); 
    sampleDB.close(); 
    } 

и добавить данные

public void insertData(String username,String password) 
    { 

     sampleDB = this.openOrCreateDatabase(SAMPLE_DB_NAME, MODE_PRIVATE, null); 

     sampleDB.execSQL(CreateTable); 
     sampleDB.execSQL("INSERT INTO " + 
       SAMPLE_TABLE_NAME + 
       " Values ('"+username+"','"+ password+"');"); 
     sampleDB.close(); 

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