Java (接近“null”:语法错误(代码1):,编译时:插入null

Java (接近“null”:语法错误(代码1):,编译时:插入null,java,android,sqlite,Java,Android,Sqlite,我试图将数据保存到数据库中,但似乎onCreate方法未运行。这可能是另一个问题,但logcat 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 insertin

我试图将数据保存到数据库中,但似乎onCreate方法未运行。这可能是另一个问题,但logcat

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)
如果我将数据库_版本从1更改为1,则会调用onUpgrade方法,但如果版本为1,则无法在logcat中看到来自onCreat的消息

这个类不应该创建一个.db文件吗?因为在单击按钮并运行该方法后,我在应用程序的文件夹中看不到任何文件。

插入null-表名为null。它来自您在SQLite helper onCreate中初始化的表数组。但是,不是每次打开数据库时

您可以将表_dayinit从onCreate移动到constructor

我使用数组来创建动态数量的表


如果Tabl日数组真的是动态的,那么你就麻烦多了。考虑重新设计你的数据库模式,使表是静态的,但是内容可以是动态的。

我用TabDeBultReals=新TabDeBulter……创建TabelButter的东西打赌;.@汤姆已经这样做了,应用程序没有崩溃,但是我得到了这个错误。logcatAnd这是创建实例的正确方法吗?谁调用onCreate?@Tom我不知道,buy它似乎一开始就没有被调用,Log.iSQL,DB Created;line似乎没有运行检查您的查询:INSERT INTO null_length,_namevalue?,?tbh,我认为动态表数比动态数组更重要es==静态,它们的数据较少。表的数量是开着的
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();

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