【问题标题】:Simple Sqlite Helper简单的 Sqlite 助手
【发布时间】:2015-12-18 05:00:09
【问题描述】:

今天我在这里学习 SQlite 的插入和查看插入的记录。单击保存按钮时,我收到错误“不幸的是 AppName 已停止”。有人可以帮忙吗?

SqliteDatabase 助手

public class SqliteDatabaseHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME="reg";
public static final String TABLE_NAME="user_details";
public static final String COLUMN_ID="id";
public static final String COLUMN_NAME="name";
public static final String COLUMN_EMAIL="email";
public static final String COLUMN_UNAME="uname";
public static final String COLUMN_PASSWORD="pass";
public static final int DATABASE_VERSION=1;


public SqliteDatabaseHelper(Context context){
    super(context,DATABASE_NAME,null,DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase db) {
    String sql="CREATE TABLE"+TABLE_NAME+"("+COLUMN_ID+"INTEGER PRIMARY KEY AUTO INCREMENT"+COLUMN_NAME+"VARCHAR"+COLUMN_EMAIL+"VARCHAR"
            +COLUMN_UNAME+"VARCHAR"+COLUMN_PASSWORD+"VARCHAR);";
    db.execSQL(sql);
    Log.d("create","Table Created Sucessfully");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    String sql="DROP TABLE IF EXIST user_details ";
    db.execSQL(sql);
    onCreate(db);
}
public boolean adduser(String name,String email,String uname,String pass)
{

    SQLiteDatabase db=this.getWritableDatabase();

    ContentValues contentValues=new ContentValues();


    contentValues.put(COLUMN_NAME,name);
    contentValues.put(COLUMN_EMAIL,email);
    contentValues.put(COLUMN_UNAME,uname);
    contentValues.put(COLUMN_PASSWORD,pass);

    db.insert(TABLE_NAME, null, contentValues);
    db.close();
    return true;
}
public Cursor getuser(int id)
{
    SQLiteDatabase db=this.getReadableDatabase();
    String sql="SELECT * FROM user_details WHERE id="+id+"; ";
    Cursor cursor= db.rawQuery(sql,null);
    return cursor;
}

主活动

enter code herepublic class MainActivity extends AppCompatActivity  implements View.OnClickListener{

private EditText edname;
private EditText edemail;
private EditText eduname;
private EditText edpass;
private Button bsave;
private Button bview;

SqliteDatabaseHelper db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    edname= (EditText) findViewById(R.id.fullname);
    edemail= (EditText) findViewById(R.id.email);
    eduname= (EditText) findViewById(R.id.uname);
    edpass= (EditText) findViewById(R.id.pass);
    bsave= (Button) findViewById(R.id.save);
    bview= (Button) findViewById(R.id.view);

    db= new SqliteDatabaseHelper(this);
    bsave.setOnClickListener(this);
    bview.setOnClickListener(this);

} @Override
public void onClick(View v) {
    if (v==bsave){
        insert();


    }
    if (v==bview){
        Intent intent= new Intent(MainActivity.this,ViewUser.class);
        startActivity(intent);

    }

}

public void insert() {

    String name=edname.getText().toString().trim();
    String email=edemail.getText().toString().trim();
    String unmae=eduname.getText().toString().trim();
    String upass=edpass.getText().toString().trim();

    db.adduser(name,email,unmae,upass);


    Toast.makeText(this,"New REcords Inserted Sucessfully",Toast.LENGTH_LONG).show();
}

查看用户

公共类 ViewUser 扩展 AppCompatActivity {

private EditText dispFullname;
private EditText dispEmail;
private EditText dispUname;
private EditText dispass;
private EditText dispuid;
private Button show;
private Button home;

SqliteDatabaseHelper db;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_user);

    dispuid= (EditText) findViewById(R.id.uid);
    dispFullname= (EditText) findViewById(R.id.fullnamedisp);
    dispEmail= (EditText) findViewById(R.id.emaildisp);
    dispUname= (EditText) findViewById(R.id.unamedisp);
    dispass= (EditText) findViewById(R.id.passdisp);
    show= (Button) findViewById(R.id.show);
    home= (Button) findViewById(R.id.Home);
    db=  new SqliteDatabaseHelper(this);
    show.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showuser(Integer.parseInt(dispuid.getText().toString().trim()));
        }
    });
    home.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent= new Intent(ViewUser.this,MainActivity.class);
            startActivity(intent);
        }
    });

}

private void showuser(int id) {
    Cursor c =db.getuser(id);
    c.moveToFirst();
    {
        if (c!=null){
            dispuid.setText(c.getString(c.getColumnIndex(SqliteDatabaseHelper.COLUMN_ID)));
            dispFullname.setText(c.getString(c.getColumnIndex(SqliteDatabaseHelper.COLUMN_NAME)));
            dispEmail.setText(c.getString(c.getColumnIndex(SqliteDatabaseHelper.COLUMN_EMAIL)));
            dispUname.setText(c.getString(c.getColumnIndex(SqliteDatabaseHelper.COLUMN_UNAME)));
            dispass.setText(c.getString(c.getColumnIndex(SqliteDatabaseHelper.COLUMN_PASSWORD)));


        }
    }

}

日志:

09-21 19:38:52.261  16080-16080/com.example.karthi.sqlitedesign E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.karthi.sqlitedesign, PID: 16080
android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
        at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
        at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
        at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
        at com.example.karthi.sqlitedesign.ViewUser.showuser(ViewUser.java:63)
        at com.example.karthi.sqlitedesign.ViewUser.access$100(ViewUser.java:14)
        at com.example.karthi.sqlitedesign.ViewUser$1.onClick(ViewUser.java:43)
        at android.view.View.performClick(View.java:4661)
        at android.view.View$PerformClick.run(View.java:19498)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5641)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1288)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1104)
        at dalvik.system.NativeStart.main(Native Method)
09-21 19:39:17.715  17307-17407/? D/show﹕ read firstrelease/release_text from assets
09-21 19:39:42.500  17785-17997/? D/show﹕ read firstrelease/release_text from assets
09-21 19:39:55.252  18211-18293/? D/show﹕ read firstrelease/release_text from assets

【问题讨论】:

  • 添加了@IntelliJAmiya
  • 你需要在你的建表语句中放一些空格
  • 请检查 String sql="CREATE TABLE" 语句
  • 我有一个像 Id,name,email,username,password 这样的字段...我打算使用 id 查看详细信息

标签: android sqlite buttonclick user-registration


【解决方案1】:

感谢 Opiatefuchs @karthickYadav

您缺少Sqlite CREATE TABLE 语句。

你的错

  1. 使用AUTOINCREMENT 而不是AUTO INCREMENT
  2. 使用TEXT 而不是VARCHAR

在创建数据库之前,请阅读此Android SQLite Database TutorialSQLiteDatabase

虚拟示例

String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_TAXONOMY + "("
            + KEY_ID + " INTEGER PRIMARY KEY , " + KEY_TAXONOMY_CODE + " TEXT, "
            + KEY_DISPLAY_NAME+" TEXT )";
    db.execSQL(CREATE_CONTACTS_TABLE);

编辑

String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME + " TEXT, "+ COLUMN_EMAIL +"TEXT," + COLUMN_UNAME + "TEXT," + COLUMN_PASSWORD +" TEXT )"; db.execSQL(CREATE_CONTACTS_TABLE); 

【讨论】:

  • String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + COLUMN_ID + " INTEGER PRIMARY KEY, " + COLUMN_NAME + " TEXT, "+ COLUMN_EMAIL +"TEXT," + COLUMN_UNAME + "TEXT, " + COLUMN_PASSWORD +" TEXT )"; db.execSQL(CREATE_CONTACTS_TABLE);对吗?
  • 整数主键自动增量在哪里?
  • 我有一个疑问,他们中的一些人在说 AUTO INCREMENT,而有些人在说 AUTOINCREMENT..无论如何,上面的代码都适用于成功插入记录..但是当我点击使用 ID 显示应用程序时是崩溃
  • @karthickYadav 很高兴听到第一次工作。好的,你可以为第二种情况添加 logcat
  • 谢谢姬我会检查的
【解决方案2】:

您的 SQLite 字符串错误,您需要在里面添加空格和逗号,如下所示:

String sql="CREATE TABLE "+TABLE_NAME+" ("+COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+COLUMN_NAME+" VARCHAR, "+COLUMN_EMAIL+" VARCHAR, "
            +COLUMN_UNAME+" VARCHAR, "+COLUMN_PASSWORD+" VARCHAR);";

编辑

不要分离 AUTOINCREMENT

【讨论】:

  • 还是同样的问题@IntelliJAmiya
  • @Opiatefuchs 我猜 karthick 患有语法错误
  • 完成更新新Logcat
  • 使用自动增量而不是自动增量
  • 查看我的更新...不要自动增量,使用自动增量
【解决方案3】:

这个字符串

CREATE TABLEuser_details(idINTEGER PRIMARY KEY AUTO INCREMENTnameVARCHARemailVARCHARunameVARCHARpassVARCHAR);

需要看起来像这样

CREATE TABLE user_details(id INTEGER PRIMARY KEY AUTO INCREMENT, name VARCHAR, email VARCHAR, uname VARCHAR, pass VARCHAR);

【讨论】:

  • 还是有问题
【解决方案4】:

你需要像这样用双引号中的空格编写创建表命令.. String sql="CREATE TABLE "+TABLE_NAME+"("+COLUMN_ID+" INTEGER PRIMARY KEY AUTO INCREMENT "+COLUMN_NAME+" VARCHAR "+COLUMN_EMAIL+" VARCHAR " +COLUMN_UNAME+" VARCHAR "+COLUMN_PASSWORD+" VARCHAR);";

【讨论】:

    【解决方案5】:

    问题来了

    android.database.sqlite.SQLiteException: near "TABLEuser_details": syntax error (code 1): , while compiling: CREATE TABLEuser_details(idINTEGER PRIMARY KEY AUTO INCREMENTnameVARCHARemailVARCHARunameVARCHARpassVARCHAR);
    

    在您的创建表语句中替换为您缺少的空格和列名之间的“,”

    String sql="CREATE TABLE "+TABLE_NAME+"("+COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+COLUMN_NAME+" TEXT,"+COLUMN_EMAIL+" TEXT,"
                +COLUMN_UNAME+" TEXT,"+COLUMN_PASSWORD+" TEXT);";
    

    【讨论】:

    • 还是有问题
    • @karthickYadav 检查更新回答您的自动增量关键字
    • @karthickYadav 检查它必须是 AUTOINCREMENT
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多