2015-08-16 22 views
1

下面的教程我想在执行此操作时将一行插入到表中向数据库中插入一行时的运行时间致命异常 其Helper数据库类: DatabasaeAdaptor.javaSQlite:IllegalStateException:无法在插入一行时执行该活动的方法

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"); 
    } 


} 
} 

如果它在mainactivity adduser的方法应该是这个样子?

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

初始化数据库适配器的位置?该代码不在您的代码片段中。你在哪一行得到IllegalStateException? –

+0

是的,你应该首先初始化。最好在onCreate方法中编写以下代码行。 db = new DatabaseAdaptor(getApplicationContext()); –

+0

我工作,但在这个声明中有错误,最新错误私人静态最终字符串DROP_TABLE =“DROP TABLE IF EXISTS”+ TABLE_NAME; – Sarah

回答

0

请使用有效表名!它好像你正在使用表名这将导致错误!

您需要在表名之前留出空格! 请用下面的语句来创建表,

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个字符的完整 - 它从不截断。

+0

不能工作同样的错误:CREATE_TABLE =“CREATE TABLE”+ TABLE_NAME +“(”+ UID +“INTEGER PRIMARY KEY AUTOINCREMENT,”+ NAME +“VARCHAR(255),”+ PASSWORD +“VARCHAR(255));”; – Sarah

+0

你的表名是什么? –

+0

表名是表 – Sarah

相关问题