这是我的主要活动,我在MainActivity方法的第29行insertData()中遇到异常,MyDatabaseAdapter()类包含schema.Can你能帮我解决我收到错误的地方吗?
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText editText;
Button button;
MyDatabaseAdapter myDatabaseAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText=(EditText)findViewById(R.id.editText);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name=editText.getText().toString();
long id=myDatabaseAdapter.insertData(name);
if(id<0)
{
Toast.makeText(MainActivity.this,"Unsuccessful",Toast.LENGTH_LONG);
}
else
{
Toast.makeText(MainActivity.this,"Successfull",Toast.LENGTH_LONG).show();
}
}
});
}
}
这是我的sqlite助手类
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class MyDatabaseAdapter {
MyDatabase myDatabase;
MyDatabaseAdapter(Context context)
{
myDatabase=new MyDatabase(context);
}
public long insertData(String name)
{
SQLiteDatabase sqLiteDatabase=myDatabase.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put(MyDatabase.NAME,name);
long id=sqLiteDatabase.insert(myDatabase.TABLE_NAME,null,contentValues);
return id;
}
static class MyDatabase extends SQLiteOpenHelper
{
private static final String DATABASE_NAME="Mydatabase";
private static final int DATABASE_VERSION=3;
private static final String TABLE_NAME="MyContacts";
private static final String NAME="Name";
// private static final String ADDRESS="Address";
private static final String UID="_id";
private static final String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+"("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+NAME+" VARCHAR(255),;";
private static final String DROP_TABLE="DROP TABLE IF EXISTS" +TABLE_NAME;
public MyDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Toast.makeText(context,"Constructor is called",Toast.LENGTH_LONG).show();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_TABLE);
onCreate(db);
}
}
}
答案 0 :(得分:1)
您没有实例化MyDatabaseAdapter类。试试
myDatabaseAdapter = new MyDatabaseAdapter(this) after setContentView().
答案 1 :(得分:1)
首先,您应该能够为我们提供更多信息。您的logcat输出应该准确显示错误是什么,或者与调试器一起运行以捕获异常。无论如何,使用提供的信息,至少有一个问题是你的create语句有无效的语法。它评估为:
CREATE TABLE MyContacts(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name VARCHAR(255),;
不需要逗号和分号,也没有右括号。它应该是:
CREATE TABLE MyContacts(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name VARCHAR(255))
或更正确:
CREATE TABLE MyContacts(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name TEXT)
...因为SQLite中没有VARCHAR类型。类型亲和力将您的VARCHAR(255)转换为TEXT,因为它包含字符串&#39; CHAR&#39;但最好只指定SQLite类型以确保达到预期效果。
答案 2 :(得分:0)
对不起,如果我说错了话,我还在学习。
但在第29行,考虑到你有2行代表包和一个休息,这就是这一行:
不应该长期用于数字吗?
long id=myDatabaseAdapter.insertData(name);
&#34; long:长数据类型是64位二进制补码整数。该 signed long的最小值为-263,最大值为263-1。 在Java SE 8及更高版本中,您可以使用长数据类型来表示 无符号64位长,最小值为0,最大值为0 值为264-1。需要一系列值时,请使用此数据类型 比int提供的更广泛。 Long类还包含方法 比如compareUnsigned,divideUnsigned等支持算术 无符号长的操作。&#34;