2016-11-30 12 views
-2

。INSERT INTO私はデータベースにデータを保存しようとしていますが、それはのonCreateメソッドが実行されないと思われ、これは別かもしれないことがございます。問題ではなくlogcat(「ヌル」に近い:構文エラー(コード1):、コンパイル中:ヌル

12-01 01:22:41.785 19724-19724/com.example.user.timetable_test E/SQLiteLog: (1) near "null": syntax error 
12-01 01:22:41.795 19724-19724/com.example.user.timetable_test E/SQLiteDatabase: Error inserting _length=1 _name=Break 
                       android.database.sqlite.SQLiteException: near "null": syntax error (code 1): , while compiling: INSERT INTO null(_length,_name) VALUES (?,?) 
                       ################################################################# 
                       Error Code : 1 (SQLITE_ERROR) 
                       Caused By : SQL(query) error or missing database. 
                        (near "null": syntax error (code 1): , while compiling: INSERT INTO null(_length,_name) VALUES (?,?)) 
                       ################################################################# 
                        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
                        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1058) 
                        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:623) 
                        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
                        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59) 
                        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
                        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1607) 
                        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1479) 
                        at com.example.user.timetable_test.setup.TableDBHandler.addEntry(TableDBHandler.java:79) 
                        at com.example.user.timetable_test.setup.SetTable$PlaceholderFragment$1.onClick(SetTable.java:227) 
                        at android.view.View.performClick(View.java:5697) 
                        at android.widget.TextView.performClick(TextView.java:10826) 
                        at android.view.View$PerformClick.run(View.java:22526) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:158) 
                        at android.app.ActivityThread.main(ActivityThread.java:7225) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

SQLiteのクラスは次のとおりです。

package com.example.user.timetable_test.setup; 

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

import com.example.user.timetable_test.MiscData; 


public class TableDBHandler extends SQLiteOpenHelper{ 

    private MiscData data = MiscData.getInstance(); 

    private static int  DATABASE_VERSION = 1; 
    private static String DATABASE_NAME  = "Timetable.db"; 
    private static String[] TABLE_DAY   = new String[MiscData.getInstance().getDays()]; 
    private static String COLUMN_SESSION_NUM = "_id"; 
    private static String COLUMN_NAME  = "_name"; 
    private static String COLUMN_LENGTH  = "_length"; 
    private SQLiteDatabase db; 


    public TableDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, 
          int version){ 

     super(context, DATABASE_NAME, factory, DATABASE_VERSION); 

     db = getWritableDatabase(); 
    } 


    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase){ 


     Log.i("SQL", "DB Created"); 
     for(int i = 0; i < data.getDays(); i++){ 

      TABLE_DAY[i] = data.getDay(i + data.getFirstDay()); 

     } 

     for(int i = 0; i < data.getDays(); i++){ 
      String query = "CREATE TABLE " + TABLE_DAY[i] + "(" + COLUMN_SESSION_NUM + 
          " INTEGER PRIMARY KEY ," + COLUMN_NAME + " TEXT," + 
          COLUMN_LENGTH + " INTEGER " + ");"; 

      sqLiteDatabase.execSQL(query); 
     } 
    } 


    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1){ 

     Log.i("SQL", "DB updated"); 


     for(int j = 0; j < data.getDays(); j++){ 
      TABLE_DAY[j] = data.getDay(j + data.getFirstDay()); 
      sqLiteDatabase.execSQL("DROP TABLE EXISTS " + TABLE_DAY[j]); 
     } 
     onCreate(sqLiteDatabase); 


    } 


    public void addEntry(int day, String name, int length){ 

     ContentValues values = new ContentValues(); 
     values.put(COLUMN_NAME, name); 
     values.put(COLUMN_LENGTH, length); 

     SQLiteDatabase db = getWritableDatabase(); 
     db.insert(TABLE_DAY[day], null, values); 
     db.close(); 

    } 
} 

が、私はテーブルの動的な数を作成するために、配列を使用しています

のonCreateメソッド内のログメッセージがないではありません。 tに登場する彼はlogcat、私は多くをチェックした。私はonUpgradeメソッドが呼び出された1からDATABASE_VERSIONを変更した場合は

tableDBHandler.addEntry(page, sessionSpinners[i].getSelectedItem().toString(), Integer.parseInt(lengthText[i].getText().toString())); 

が、バージョンが1だった場合、私はlogcatで、onCreatからのメッセージを見ることができません。

addEntryメソッドを呼び出します。

このクラスでは、.dbファイルを作成しないでください。ボタンをクリックしてメソッドを実行すると、アプリケーションのフォルダ内にファイルが表示されないためです。

+0

私はあなたが 'tableDBHandler = new TableDBHandler(...);'で 'tableDBHandler'を作成することを賭けました。 – Tom

+0

@Tomはすでにそうしていますが、アプリはクラッシュしていませんが、私はlogcat – Omar

+0

でこのエラーが発生しています。これは正しい方法ですか?誰が 'onCreate'を呼びますか? – Tom

答えて

4

INSERT INTO null - テーブル名がnullです。それはTABLE_DAY配列からあなたのSQLiteヘルパーonCreate()で初期化されます。しかし、onCreate() is only invoked when the database file is created、データベースを開くたびにではありません。

あなたは、例えばするonCreate()からTABLE_DAYのinitを移動することができますコンストラクタ。

私はテーブルの動的な数を作成するために、配列を使用しています。

TABLE_DAYの配列が本当に動的な場合は、はるかに問題になります。テーブルが静的であるがコンテンツは動的になるようにデータベーススキーマを再設計することを検討してください。

+1

tbh、私は "動的なテーブルの数"は動的配列よりも重要だと思います。テーブル==スタティック、そのデータ、あまりそうではありません。 – Rogue

+0

テーブルの数は – Omar

+0

にあります。すごくうれしいですね、ありがとう – Omar

関連する問題