Android SQlite:IllegalStateException:插入行时无法执行活动的方法

Android SQlite:IllegalStateException:插入行时无法执行活动的方法,android,database,sqlite,android-sqlite,sqliteopenhelper,Android,Database,Sqlite,Android Sqlite,Sqliteopenhelper,我正在学习一个教程,我想在表中插入一行,但在数据库中插入一行时会出现运行时致命异常 其助手数据库类: databaseadaptor.java package com.example.sarahn.inserttable; import android.content.ContentValues; import android.content.Context; import android.database.SQLException; import android.database.sqlit

我正在学习一个教程,我想在表中插入一行,但在数据库中插入一行时会出现运行时致命异常 其助手数据库类: databaseadaptor.java

package com.example.sarahn.inserttable;

import android.content.ContentValues;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseAdaptor {

Helperdb helperdb;
DatabaseAdaptor(Context context){
    helperdb = new Helperdb(context);
}

public long insertdata(String name,String password){

    SQLiteDatabase db = helperdb.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(helperdb.NAME,name);
    contentValues.put(helperdb.PASSWORD,password);
    long id = db.insert(helperdb.TABLE_NAME,null,contentValues);
    return id;
}

static class Helperdb extends SQLiteOpenHelper
{
   private static final String DATABASE_NAME = "insert";
   private static final String TABLE_NAME = "table";
   private static final int DATABASE_VERSION = 1;
   private static final String UID = "_name";
   private static final String NAME = "user";
   private static final String PASSWORD = "pw";
   private static final String CREATE_TABLE = "CREATE TABLE  

"+TABLE_NAME+"("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+"  

VARCHAR(255), "+PASSWORD+" VARCHAR(255));";
   private static final String DROP_TABLE = "DROP TABLE IF EXISTS"  

+TABLE_NAME;
   private Context context;


   //context, database name,
   public Helperdb (Context context) {
       super(context,DATABASE_NAME, null, DATABASE_VERSION);
       this.context= context;
       Message.message(context, "constructor called");
   }

   @Override
   public void onCreate(SQLiteDatabase db) {
       try {
           db.execSQL(CREATE_TABLE);
           Message.message(context, "OnCreate called");
       }catch (SQLException e)
       {
           Message.message(context, "" + e);
       }
   }

   @Override
   public void onUpgrade(SQLiteDatabase db, int oldVersion, int  

newVersion) {

       try {
           db.execSQL(DROP_TABLE);
           onCreate(db);
           Message.message(context, "Onupgrade called");
       }catch (SQLException e)
       {

           Message.message(context,""+e );
           Message.message(context, "Error");
       }

   }
 }
}
以及它的MainActivity.java

package com.example.sarahn.inserttable;

import android.app.Activity;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;


public class MainActivity extends Activity {
EditText username;
EditText password;
DatabaseAdaptor db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    username =(EditText) findViewById(R.id.etname);
    password = (EditText) findViewById(R.id.etpass);


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is      

present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
public void adduser(View view)
{
    String user = username.getText().toString();
    String pass = password.getText().toString();
    long count =db.insertdata(user,pass);
    if(count<0)
    {
        Message.message(this,"Unsucessful");
    }else
    {
        Message.message(this,"Sucessfull");
    }


}
}
package com.example.sarahn.inserttable;
导入android.app.Activity;
导入android.support.v7.app.ActionBarActivity;
导入android.os.Bundle;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.widget.EditText;
公共类MainActivity扩展了活动{
编辑文本用户名;
编辑文本密码;
数据库适配器数据库;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
用户名=(EditText)findViewById(R.id.etname);
密码=(EditText)findViewById(R.id.etpass);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//对菜单进行充气;这会将项目添加到操作栏(如果有)
目前
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
公共void adduser(视图)
{
字符串user=username.getText().toString();
字符串pass=password.getText().toString();
长计数=db.insertdata(用户,通过);

如果(count请使用有效的表名!您似乎将用作表名,这将导致错误

您需要在表名前留下一个空格! 请使用以下语句创建表

 private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+"("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(255), "+PASSWORD+" VARCHAR(255));";
注意:类型名称(例如:“VARCHAR(255)”)后面的括号中的数字参数被SQLite忽略-SQLite不施加任何长度限制


SQLite不强制执行VARCHAR的长度。您可以声明VARCHAR(10)SQLite将很乐意让您在其中输入500个字符。它将保持所有500个字符的完整性—它从不截断。

请使用有效的表名!您似乎正在使用表名作为表名,这将导致错误

您需要在表名前留下一个空格! 请使用以下语句创建表

 private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+"("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(255), "+PASSWORD+" VARCHAR(255));";
注意:类型名称(例如:“VARCHAR(255)”)后面的括号中的数字参数被SQLite忽略-SQLite不施加任何长度限制


SQLite不强制执行VARCHAR的长度。您可以声明VARCHAR(10)SQLite将很乐意让您在其中输入500个字符。它将保持所有500个字符的完整性-它不会截断。

您在哪里初始化数据库适配器?代码段中没有该代码。您在哪一行获得非法状态异常?是的,您应该先初始化。最好编写以下代码行在onCreate method.db=new databaseadapter(getApplicationContext())中,我工作过,但这条语句中有错误,有什么不对的私有静态最终字符串DROP\u TABLE=“DROP TABLE IF EXISTS”+TABLE\u NAME;构造函数调用了一个错误(创建表时),结果是无法成功调用db.execSQL(DROP\u TABLE);在onUpgrade方法中。这将删除初始化数据库适配器的整个表?该代码不在代码段中。在哪一行获得IllegalStateException?是的,您应该首先初始化。最好在onCreate方法中编写以下代码行。db=new databaseadapter(getApplicationContext());我工作过,但该语句中有错误,有什么不对私有静态最终字符串DROP_TABLE=“DROP TABLE IF EXISTS”+TABLE_NAME;构造函数调用了一个错误(在创建表时),结果导致调用db.execSQL(DROP_TABLE)失败;在onUpgrade方法中。这将删除整个表。不起作用的错误相同:CREATE_TABLE=“CREATE TABLE”+TABLE_NAME+”(“+UID+”整型主键自动递增,“+NAME+”VARCHAR(255),“+PASSWORD+”VARCHAR(255));您的表名是什么?更改表名,因为表是sql中的关键字。请查看更新后的答案!不工作相同的错误:CREATE_table=“CREATE table”+table_name+”(“+UID+”整型主键自动递增,“+name+”VARCHAR(255),“+PASSWORD+”VARCHAR(255));您的表名是什么?更改表名,因为表是sql中的关键字。请查看更新的答案!