您将遇到的第一个问题是您正在尝试使用CREATE TABLE TABLE_NAME (COL_1 PRIMARY KEY AUTOINCREMENT ..... 创建一个表
将创建(尝试)的表将是 TABLE_NAME 而不是 Testing_Table,因为变量名称嵌入在字符串中,而不是被解析并附加到字符串中。
字符串中包含多个变量。
另一个错误是你有PRIMARY KEY AUTOINCREMENT autoincrement 只能用于 rowid 的别名,必须使用专门的 INTEGER PRIMARY KEY 定义。
您不需要 AUTOINCREMENT,因为 INTEGER PRIMARY KEY 会做您想做的事情(增加 ID 列的值,因此第一个是 1,然后可能是 2,然后可能是 3 ....)。 AUTOINCREMENT 基本上是一个约束/规则,它表示数字必须更高(对于您的测试来说,它会是(并不重要))。
我建议以下基于您的代码(但没有点击处理)成功创建表,在表中插入一些行(不是表),然后提取它们并将提取的数据写入日志.
首先修改AdminSQLiteOpenHelper:-
class AdminSQLiteOpenHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
companion object{
const val DATABASE_NAME = "test.db"
const val DATABASE_VERSION = 1;
var TABLE_NAME = "Testing_Table"
const val COL_1 = "ID"
var COL_2 = "NAME"
var COL_3 = "SURNAME"
var COL_4 = "YEARS"
}
val db = this.writableDatabase //<<<<<<<<<< ADDED
override fun onCreate(db: SQLiteDatabase) {
//<<<<<<<<<< NUMEROUS CHANGES >>>>>>>>>>
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME +
"("
+ COL_1 + " INTEGER PRIMARY KEY," // no need for AUTOINCREMENT you want INTEGER PRIMARY KEY not PRIMARY KEY
+ COL_2 + " TEXT,"
+ COL_3 + " TEXT,"
+ COL_4 + " INTEGER" +
")"
)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("drop table if exists " + TABLE_NAME) //<<<<<<<<<<< CHANGED
onCreate(db)
}
//<<<<<<<<<< ADDED >>>>>>>>>
fun insertRow(name: String, surname: String, years: Int): Long {
val cv = ContentValues()
cv.put(COL_2,name)
cv.put(COL_3,surname)
cv.put(COL_4,years)
return db.insert(TABLE_NAME,null,cv);
}
//<<<<<<<<<< ADDED >>>>>>>>>
fun getAllRowsFromTestingTable(): Cursor {
return db.query(TABLE_NAME,null, null,null,null,null, COL_3)
}
}
现在是一个 Activity (MainActivity),它执行从数据库中添加和提取数据的工作:-
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Get an instance of the DB Helper with full class scope
val db = AdminSQLiteOpenHelper(this)
// Add Some data
db.insertRow("Fred","Bloggs",10)
db.insertRow("Jane","Doe",25)
// Get all the data as a Cursor
val cursor = db.getAllRowsFromTestingTable()
// traverse the cursor writing data to the log
while(cursor.moveToNext()) {
Log.d("MYDATA",
"ID = " + cursor.getLong(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_1)) +
" First Name = " + cursor.getString(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_2)) +
" Surname = " + cursor.getString(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_3)) +
" Years = " + cursor.getInt(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_4))
)
}
cursor.close() //<<<<<<<<<< should ALWAYS close cursor when done
}
}
运行时,它会在 LOG 中生成以下内容:-
2021-04-09 17:03:01.531 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
2021-04-09 17:03:01.531 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25
附加
这是一个修改后的 MainActivity,它有一个按钮,当点击它时会在表格中添加一行。
- 这些行都是相同的,除了年份值,它是随机生成的。
- 插入后将数据库的内容写入日志。
-
AdminSQLiteOpenHelper 没有变化
:-
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Get an instance of the DB Helper with full class scope
val db = AdminSQLiteOpenHelper(this)
val buttonCrear = this.findViewById<Button>(R.id.buttonCrear)
buttonCrear.setOnClickListener{
db.insertRow("Button","Click", Random.nextInt(10,9999))
logData(db)
}
// Add Some data
db.insertRow("Fred","Bloggs",10)
db.insertRow("Jane","Doe",25)
// Get all the data as a Cursor
logData(db)
}
// Function replaces the previous logging of the data
fun logData(db: AdminSQLiteOpenHelper) {
val cursor = db.getAllRowsFromTestingTable()
while(cursor.moveToNext()) {
Log.d("MYDATA",
"ID = " + cursor.getLong(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_1)) +
" First Name = " + cursor.getString(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_2)) +
" Surname = " + cursor.getString(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_3)) +
" Years = " + cursor.getInt(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_4))
)
}
cursor.close() //<<<<<<<<<< should ALWAYS close cursor when done
}
}
这是点击按钮几次后的日志示例:-
在任何点击之前
2021-04-09 18:45:47.813 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
2021-04-09 18:45:47.813 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25
第一次点击后
2021-04-09 18:45:58.567 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
2021-04-09 18:45:58.567 D/MYDATA: ID = 3 First Name = Button Surname = Click Years = 9910
2021-04-09 18:45:58.567 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25
第二次点击后
2021-04-09 18:45:59.675 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
2021-04-09 18:45:59.675 D/MYDATA: ID = 3 First Name = Button Surname = Click Years = 9910
2021-04-09 18:45:59.675 D/MYDATA: ID = 4 First Name = Button Surname = Click Years = 8263
2021-04-09 18:45:59.676 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25
第三次点击后
2021-04-09 18:46:00.611 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
2021-04-09 18:46:00.611 D/MYDATA: ID = 3 First Name = Button Surname = Click Years = 9910
2021-04-09 18:46:00.611 D/MYDATA: ID = 4 First Name = Button Surname = Click Years = 8263
2021-04-09 18:46:00.612 D/MYDATA: ID = 5 First Name = Button Surname = Click Years = 9625
2021-04-09 18:46:00.613 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25