(Android Studio Database)应用程序在输入数据时一直停止.(使用java, SQLite数据库).



这个小项目的目标是输入消息,链接到结果xml并显示结果。但在AVD运行并点击[添加]按钮后,应用程序停止了…如何解决这个问题?我想知道这个问题的责任(只是代码,AVD…)

这是java文件和代码。

[DBHelper.java]

package com.example.pr_0813;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public DBHelper(Context context) {
super(context, "memodb", null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String memoSQL = "create table tb_memo " +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"content)";
db.execSQL(memoSQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS tb_memo");
onCreate(db);
}
}

[MainActivity.java]

package com.example.pr_0813;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText input_msg;
Button add_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
input_msg = findViewById(R.id.add_content);
add_btn = findViewById(R.id.add_btn);
add_btn.setOnClickListener(this);
}
public void onClick(View v) {
String content = input_msg.getText().toString();
DBHelper helper = new DBHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into tb_memo (_id, content) values (?,?)");
db.close();
Intent intent = new Intent(this, ReadDBActivity.class);
startActivity(intent);
}
}

[ReadDActivity.java]

package com.example.pr_0813;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class ReadDBActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read_db);
TextView content_view = findViewById(R.id.read_content);
DBHelper helper = new DBHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.rawQuery("select content from tb_memo order by _id desc limit 1", null);
while(cursor.moveToNext()) {
content_view.setText(cursor.getString(0));
}
db.close();
}
}

xml视图(activity_main.xml)

<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:background="#696969"/>
<EditText
android:id="@+id/add_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="INPUT YOUR MESSAGE"
android:textSize="30dp"
android:textStyle="bold"/>
<Button
android:id="@+id/add_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADD"
android:textStyle="bold"
android:textSize="30dp"/>
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:background="#696969"/>

[activity_read_db.xml]

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="=== R E S U L T ==="
android:textSize="30dp"/>
<TextView
android:id="@+id/read_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:textStyle="bold"/>

首先,如果它崩溃了,您可以在logcat中找到堆栈跟踪。这样你就知道它在哪里崩溃了。

如果没有堆栈跟踪,我们只能猜测问题所在。可能的原因是1。Create table SQL出现问题
String memoSQL = "create table tb_memo " +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"content)";

内容没有类型。你可以改成

String memoSQL = "create table tb_memo " +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"content TEXT )";

第二,SQL插入表没有值。您可以使用ContentValues来避免编写原始sql。

SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into tb_memo (_id, content) values (?,?)");
db.close();

改变

SQLiteDatabase db = helper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("content", add_content.getText().toString());
db.insert("tb_memo", cv, null);

_id不需要,因为它是自动递增的。

最新更新