sqlite SQL表拒绝向列插入用户输入

piztneat  于 2023-03-13  发布在  SQLite
关注(0)|答案(2)|浏览(195)

我正在制作一个应用程序,我输入一个名称和一个数字,点击保存后,名称将保存在名为infinitecounter.db的SQLITE数据库中的COUNTER_NAME列下。之后,它将数字保存在CURRENT_CLICKS列中。但是,当我启动应用程序并点击保存按钮时,应用程序崩溃。
然后,我从文件中导出数据库,并使用SQLite浏览器打开它,这是我看到的:SQLITE browser
下面是我的数据库代码:

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
import android.widget.Toast;

import androidx.annotation.Nullable;

class database1 extends SQLiteOpenHelper {
    private Context context;
    private static final String DATABASE_NAME= "infinitecounter.db";
    private static final int DATABASE_VERSION= 1;

    private static final String TABLE_NAME = "infinitecounter list";
    private static final String COLUMN_ID = "id";
    private static final String COUNTER_NAME = "title";
    private static final String CURRENT_CLICKS = ("Current Clicks"); // fix later

    public database1(@Nullable Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query =
                "CREATE TABLE " + TABLE_NAME +
                        "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        COUNTER_NAME + " TEXT, " +
                        CURRENT_CLICKS + " INTEGER);";
        db.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    void addinfincounter(String title, int current_clicks){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv =  new ContentValues();

        cv.put(COUNTER_NAME, title);
        cv.put(CURRENT_CLICKS, current_clicks);
        long results = db.insert(TABLE_NAME, null, cv);
        if(results == -1){
            Toast.makeText(context, "FAILED!", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "SUCCESS!", Toast.LENGTH_SHORT).show();
        }

    }
}

下面是我激活addinfincounter方法的Java页面

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;

public class infincounter_setup extends AppCompatActivity {

    EditText name, clicks;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_infincounter_setup);
    }
    public void cancel(View V){
        Intent i = new Intent(this, MainActivity.class);
        startActivity(i);
    }

    public void save(View B) {
        name = findViewById(R.id.infincounter_name);
        clicks = findViewById(R.id.clicks);
        if (name.length() == 0 || name == null) {
            Toast.makeText(this, "PLEASE ASSIGN A NAME", Toast.LENGTH_LONG).show();
        } else{
            database1 myDB = new database1(infincounter_setup.this);
            myDB.addinfincounter(name.getText().toString(), Integer.parseInt(clicks.getText().toString()));
        }
    }
}

最后,这是蓝图

eufgjt7s

eufgjt7s1#

我认为这就是问题所在:
private static final String TABLE_NAME = "infinitecounter list";
表名只能包含字母数字字符和'_',或者您可以在名称两边加上括号。请参阅以下答案:What are valid table names in SQLite?

lfapxunr

lfapxunr2#

发生的情况是,当数据库第一次被访问(打开)时,也就是当您试图插入行时。
1.如果数据库尚不存在,则创建该数据库,并添加android_metadata表(其中包含语言环境)。
1.重写的onCreate方法被调用,但由于语法错误而失败,如下所示:-
android.database.sqlite.SQLiteException: near "list": syntax error (code 1 SQLITE_ERROR): , while compiling: CREATE TABLE infinitecounter list(id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, Current Clicks INTEGER);
1.作为应用程序崩溃的一部分,数据库已关闭。
因此,您只能看到一个表。
根据消息,问题在于infinitecounterlist之间有空格。SQLite将期望:-

***(**以启动列定义,或

要解决此问题,您需要定义表名,使其不会导致语法错误,例如***infinitecounter_list***(如下所述)。

更改名称后,由于onCreate方法只在创建数据库时运行一次,因此您应该卸载应用程序并重新运行(卸载会导致数据库被删除)。

注意您将遇到当前点击次数列名的类似问题。

遵循上述内容,即使用:-

private static final String TABLE_NAME = "infinitecounter_list"; //<<<<<<<<<< CHANGED
   private static final String COLUMN_ID = "id";
   private static final String COUNTER_NAME = "title";
   private static final String CURRENT_CLICKS = ("Current_Clicks"); //<<<<<<<<<< CHANGED fix later

然后运行应用程序:-

public class MainActivity extends AppCompatActivity {

    database1 db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = new database1(this);
        db.addinfincounter("Title1",100);
    }
}

然后使用App Inspection显示:-

即,已按预期创建表并插入行。

相关问题