我正在制作一个应用程序,我输入一个名称和一个数字,点击保存后,名称将保存在名为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()));
}
}
}
2条答案
按热度按时间eufgjt7s1#
我认为这就是问题所在:
private static final String TABLE_NAME = "infinitecounter list";
表名只能包含字母数字字符和'_',或者您可以在名称两边加上括号。请参阅以下答案:What are valid table names in SQLite?
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.作为应用程序崩溃的一部分,数据库已关闭。
因此,您只能看到一个表。
根据消息,问题在于infinitecounter和list之间有空格。SQLite将期望:-
***
(
**以启动列定义,或.
**指定模式名和表名的分隔,或者***
AS
**如果通过SELECT创建和填充表要解决此问题,您需要定义表名,使其不会导致语法错误,例如***infinitecounter_list***(如下所述)。
更改名称后,由于onCreate方法只在创建数据库时运行一次,因此您应该卸载应用程序并重新运行(卸载会导致数据库被删除)。
注意您将遇到当前点击次数列名的类似问题。
遵循上述内容,即使用:-
然后运行应用程序:-
然后使用App Inspection显示:-
即,已按预期创建表并插入行。