为什么SQLite的不会让我插入数据到数据库 [英] Why will SQLite will not let me insert data to database

查看:246
本文介绍了为什么SQLite的不会让我插入数据到数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基本上当我运行的应用程序,它说,它不能添加,num1input和num2input到数据库,因为有一个错误

  entry.createEntry(NUMBER_ONE,NUMBER_TWO,答案);

这是我的code为MainActivity:我还拿出了答案,因为它有一个错误出现,我想这是因为,使计算按钮不给予了相同的输出,它基本上是重命名从XML一个TextView。

 公共类MainActivity扩展活动实现OnClickListener {按钮SQLUPDATE,sqlView;
的EditText sqlNumber1,sqlNumber2,sqlAnswer;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    SQLUPDATE =(按钮)findViewById(R.id.bSQLUpdate);
    sqlNumber1 =(EditText上)findViewById(R.id.num1input);
    sqlNumber2 =(EditText上)findViewById(R.id.num2input);
    sqlAnswer =(EditText上)findViewById(R.id.ans1);    sqlView =(按钮)findViewById(R.id.bSQLopenView);
    sqlView.setOnClickListener(本);
    sqlUpdate.setOnClickListener(本);}公共无效的onClick(查看为arg0){    开关(arg0.getId()){
    案例R.id.bSQLUpdate:
        布尔didItWork = TRUE;
        尝试{
        。字符串NUMBER_ONE = sqlNumber1.getText()的toString();
        。字符串NUMBER_TWO = sqlNumber2.getText()的toString();
        。字符串答案= sqlAnswer.getText()的toString();        DBA入门=新的DBA(MainActivity.this);        entry.open();        entry.createEntry(NUMBER_ONE,NUMBER_TWO);        entry.close();
        }赶上(例外五){
            didItWork = FALSE;
            字符串错误= e.toString();
            对话D =新的对话框(本);
            d.setTitle(该死!);
            TextView的电视=新的TextView(本);
            tv.setText(错误);
            d.setContentView(电视);
            d.show();
        }最后{
            如果(didItWork){
                对话D =新的对话框(本);
                d.setTitle(它的工作);
                TextView的电视=新的TextView(本);
                tv.setText(成功!);
                d.setContentView(电视);
                d.show();
            }
        }
        打破;
    案例R.id.bSQLopenView:
        意图I =新意图(com.cmpcione.calculator.SQLVIEW);
        startActivity(ⅰ);
        打破;
    }
}公共无效总和(视图v){
    的EditText number1input =(EditText上)findViewById(R.id.num1input);
    的EditText number2input =(EditText上)findViewById(R.id.num2input);    整型num1=Integer.parseInt(number1input.getText().toString()),num2=Integer.parseInt(number2input.getText().toString());    整数ANS1 = NUM​​1 + NUM2;    TextView的回答=(的TextView)findViewById(R.id.ans1);    answer.setText(ans1.toString());}

在code为类DBA:

 公共类DBA {公共静态最后弦乐KEY_ROWID =_id;
公共静态最后弦乐KEY_NUMBER1 =num1input;
公共静态最后弦乐KEY_NUMBER2 =num2input;
公共静态最后弦乐KEY_ANSWER =ANS1;
私有静态最后弦乐DATABASE_NAME =CalculationsDB;
私有静态最后弦乐DATABASE_TABLE =Calculation_table;
私有静态最终诠释DATABASE_VERSION = 2;私人DbHelper ourHelper;
私人最终上下文ourContext;
私人SQLiteDatabase ourDatabase;私有静态类DbHelper扩展SQLiteOpenHelper {    公共DbHelper(上下文的背景下){
        超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
        // TODO自动生成构造函数存根
    }    @覆盖
    公共无效的onCreate(SQLiteDatabase DB){
        // TODO自动生成方法存根
        //创建表和行
        db.execSQL(CREATE TABLE+ DATABASE_TABLE +(+                KEY_ROWID +INTEGER PRIMARY KEY,+
                KEY_NUMBER1 +TEXT NOT NULL,+
                KEY_NUMBER2 +TEXT NOT NULL,+
                KEY_ANSWER +TEXT NOT NULL);
                );
    }    @覆盖
    公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
        // TODO自动生成方法存根
        db.execSQL(DROP TABLE IF EXISTS+ DATABASE_TABLE);
        的onCreate(DB);
    }}公共DBA(上下文C){
    ourContext = C;
}公共DBA的open(){
    ourHelper =新DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    返回此;
}公共无效的close(){
    ourHelper.close();}众长createEntry(字符串NUMBER_ONE,字符串NUMBER_TWO){
    // TODO自动生成方法存根
    ContentValues​​ CV =新ContentValues​​();
    cv.put(KEY_NUMBER1,NUMBER_ONE);
    cv.put(KEY_NUMBER2,NUMBER_TWO);
    cv.put(KEY_ANSWER,答案);
    返回ourDatabase.insert(DATABASE_TABLE,空,CV);}公共字符串的getData(){
    // TODO自动生成方法存根
    的String [] =列新的String [] {KEY_ROWID,KEY_NUMBER1,KEY_NUMBER2};
    使用光标从数据库中读取//
    光标C = ourDatabase.query(DATABASE_TABLE,列,NULL,NULL,NULL,NULL,NULL);
    字符串结果=;    INT iRow = c.getColumnIndex(KEY_ROWID);
    INT iNumber1 = c.getColumnIndex(KEY_NUMBER1);
    INT iNumber2 = c.getColumnIndex(KEY_NUMBER2);
    INT iAnswer = c.getColumnIndex(KEY_ANSWER);    为(c.moveToFirst();!c.isAfterLast(); c.moveToNext()){
        //它得到我们的索引的字符串,然后它获得的第一个数字,然后最后
        结果=结果+ c.getString(iRow)++ c.getString(iNumber1)++ c.getString(iNumber2)+\\ n;
    }
    返回null;
}

}
logcat的完整名单:它首先是不能够的数字插入到数据库中:

  04-11 17:57:48.177:E / AndroidRuntime(278):致命异常:主要
04-11 17:57:48.177:E / AndroidRuntime(278):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.cmpcione.calculator / com.cmpcione.calculator.MainActivity}:java.lang.ClassCastException:机器人.widget.TextView
04-11 17:57:48.177:E / AndroidRuntime(278):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
04-11 17:57:48.177:E / AndroidRuntime(278):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-11 17:57:48.177:E / AndroidRuntime(278):在android.app.ActivityThread.access $ 2300(ActivityThread.java:125)
04-11 17:57:48.177:E / AndroidRuntime(278):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)
04-11 17:57:48.177:E / AndroidRuntime(278):在android.os.Handler.dispatchMessage(Handler.java:99)
04-11 17:57:48.177:E / AndroidRuntime(278):在android.os.Looper.loop(Looper.java:123)
04-11 17:57:48.177:E / AndroidRuntime(278):在android.app.ActivityThread.main(ActivityThread.java:4627)
04-11 17:57:48.177:E / AndroidRuntime(278):在java.lang.reflect.Method.invokeNative(本机方法)
04-11 17:57:48.177:E / AndroidRuntime(278):在java.lang.reflect.Method.invoke(Method.java:521)
04-11 17:57:48.177:E / AndroidRuntime(278):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
04-11 17:57:48.177:E / AndroidRuntime(278):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-11 17:57:48.177:E / AndroidRuntime(278):在dalvik.system.NativeStart.main(本机方法)
04-11 17:57:48.177:E / AndroidRuntime(278):java.lang.ClassCastException:产生的原因android.widget.TextView
04-11 17:57:48.177:E / AndroidRuntime(278):在com.cmpcione.calculator.MainActivity.onCreate(MainActivity.java:27)
04-11 17:57:48.177:E / AndroidRuntime(278):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-11 17:57:48.177:E / AndroidRuntime(278):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)


解决方案

是不是因为你的表名为计算,而不是 Calculation_Table

如果您编辑您的表定义确保你增加你的数据库版本,所以它进入 onUpgrade 方法并重新创建数据库。

你看到的约束下一个问题失败。是没有价值造成插入的答案列。定义说,这是不为空

下面是你需要做的:

 众长createEntry(字符串NUMBER_ONE,字符串NUMBER_TWO){
    // TODO自动生成方法存根
    ContentValues​​ CV =新ContentValues​​();
    cv.put(KEY_NUMBER1,NUMBER_ONE);
    cv.put(KEY_NUMBER2,NUMBER_TWO);    //答案需要添加到简历,去掉注释,并找出答案。
    INT答案=的Integer.parseInt(NUMBER_ONE)+的Integer.parseInt(NUMBER_TWO);
    cv.put(KEY_ANSWER,答案);
    返回ourDatabase.insert(DATABASE_TABLE,空,CV);
}

Basically when i run the app, it says, it cannot add, num1input and num2input to the database because there is an error for

entry.createEntry(number_one, number_two, answer);

This is my code for MainActivity: i also took out the answer, because it comes up with an error, i think it's because the button that makes the calculation is not giving out the same output, and it's basically renaming a TextView from the XML.

public class MainActivity extends Activity implements OnClickListener {

Button sqlUpdate, sqlView;
EditText sqlNumber1, sqlNumber2, sqlAnswer;

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sqlUpdate = (Button) findViewById(R.id.bSQLUpdate);
    sqlNumber1 = (EditText)findViewById(R.id.num1input);
    sqlNumber2 = (EditText)findViewById(R.id.num2input);
    sqlAnswer = (EditText)findViewById(R.id.ans1);

    sqlView = (Button) findViewById(R.id.bSQLopenView);
    sqlView.setOnClickListener(this);
    sqlUpdate.setOnClickListener(this);

}

public void onClick(View arg0) {

    switch (arg0.getId()){
    case R.id.bSQLUpdate:
        boolean didItWork = true;
        try{
        String number_one = sqlNumber1.getText().toString();
        String number_two = sqlNumber2.getText().toString();
        String answer = sqlAnswer.getText().toString();

        DBA entry = new DBA(MainActivity.this);

        entry.open();

        entry.createEntry(number_one, number_two);

        entry.close();
        } catch (Exception e) {
            didItWork = false;
            String error = e.toString();
            Dialog d = new Dialog(this);
            d.setTitle("Damn!");
            TextView tv = new TextView(this);
            tv.setText(error);
            d.setContentView(tv);
            d.show();
        }finally{
            if (didItWork){
                Dialog d = new Dialog(this);
                d.setTitle("It Worked");
                TextView tv = new TextView(this);
                tv.setText("Success!");
                d.setContentView(tv);
                d.show();
            }
        }
        break;
    case R.id.bSQLopenView:
        Intent i = new Intent("com.cmpcione.calculator.SQLVIEW");
        startActivity(i);
        break;
    }
}

public void sum(View v) {
    EditText number1input = (EditText)findViewById(R.id.num1input);
    EditText number2input = (EditText)findViewById(R.id.num2input);

    Integer num1=Integer.parseInt(number1input.getText().toString()),num2=Integer.parseInt(number2input.getText().toString());

    Integer ans1=num1+num2;

    TextView answer=(TextView)findViewById(R.id.ans1);

    answer.setText(ans1.toString());

}

The code for the class DBA:

public class DBA {

public static final String KEY_ROWID = "_id";
public static final String KEY_NUMBER1 = "num1input";
public static final String KEY_NUMBER2 = "num2input";
public static final String KEY_ANSWER = "ans1";


private static final String DATABASE_NAME = "CalculationsDB";
private static final String DATABASE_TABLE = "Calculation_table";
private static final int DATABASE_VERSION = 2;

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;

private static class DbHelper extends SQLiteOpenHelper{

    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        //creates table and rows
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +

                KEY_ROWID + " INTEGER PRIMARY KEY, " + 
                KEY_NUMBER1 + " TEXT NOT NULL, " + 
                KEY_NUMBER2 + " TEXT NOT NULL, " +
                KEY_ANSWER + " TEXT NOT NULL);" 
                );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }

}

public DBA(Context c){
    ourContext = c;
}

public DBA open() {
    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}

public void close() {
    ourHelper.close();

}

public long createEntry(String number_one, String number_two) {
    // TODO Auto-generated method stub
    ContentValues cv = new ContentValues();
    cv.put(KEY_NUMBER1, number_one);
    cv.put(KEY_NUMBER2, number_two);
    cv.put(KEY_ANSWER, answer);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);

}

public String getData() {
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID, KEY_NUMBER1, KEY_NUMBER2};
    //using the cursor to read from database
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
    String result = " ";

    int iRow = c.getColumnIndex(KEY_ROWID);
    int iNumber1 = c.getColumnIndex(KEY_NUMBER1);
    int iNumber2 = c.getColumnIndex(KEY_NUMBER2);
    int iAnswer = c.getColumnIndex(KEY_ANSWER);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        //it gets the string of our index then it gets the first number and then the last
        result = result + c.getString(iRow) + " " + c.getString(iNumber1) + " " + c.getString(iNumber2) + "\n";
    }
    return null;


}

} The full list of logcat: it's starting with not being able to insert the numbers to the database:

04-11 17:57:48.177: E/AndroidRuntime(278): FATAL EXCEPTION: main
04-11 17:57:48.177: E/AndroidRuntime(278): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cmpcione.calculator/com.cmpcione.calculator.MainActivity}: java.lang.ClassCastException: android.widget.TextView
04-11 17:57:48.177: E/AndroidRuntime(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
04-11 17:57:48.177: E/AndroidRuntime(278):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-11 17:57:48.177: E/AndroidRuntime(278):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-11 17:57:48.177: E/AndroidRuntime(278):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-11 17:57:48.177: E/AndroidRuntime(278):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-11 17:57:48.177: E/AndroidRuntime(278):  at android.os.Looper.loop(Looper.java:123)
04-11 17:57:48.177: E/AndroidRuntime(278):  at android.app.ActivityThread.main(ActivityThread.java:4627)
04-11 17:57:48.177: E/AndroidRuntime(278):  at java.lang.reflect.Method.invokeNative(Native Method)
04-11 17:57:48.177: E/AndroidRuntime(278):  at java.lang.reflect.Method.invoke(Method.java:521)
04-11 17:57:48.177: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-11 17:57:48.177: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-11 17:57:48.177: E/AndroidRuntime(278):  at dalvik.system.NativeStart.main(Native Method)
04-11 17:57:48.177: E/AndroidRuntime(278): Caused by: java.lang.ClassCastException: android.widget.TextView
04-11 17:57:48.177: E/AndroidRuntime(278):  at com.cmpcione.calculator.MainActivity.onCreate(MainActivity.java:27)
04-11 17:57:48.177: E/AndroidRuntime(278):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-11 17:57:48.177: E/AndroidRuntime(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

解决方案

Is it because your table is named Calculations and not Calculation_Table?

If you edited your table definition make sure you increment your database version so it goes into the onUpgrade method and recreates your database.

The next problem you're seeing constraint failed is caused by no value being inserted for the answer column. the definition says it is not null.

Here's what you need to do:

public long createEntry(String number_one, String number_two) {
    // TODO Auto-generated method stub
    ContentValues cv = new ContentValues();
    cv.put(KEY_NUMBER1, number_one);
    cv.put(KEY_NUMBER2, number_two);

    // the answer needs to be added to cv, uncomment the line and figure out the answer.
    int answer = Integer.parseInt(number_one) + Integer.parseInt(number_two);
    cv.put(KEY_ANSWER, answer);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}

这篇关于为什么SQLite的不会让我插入数据到数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆