程序点击添加后崩溃

程序点击添加后崩溃

package com.hala.view01;



import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText name,age,id;
    private RadioGroup gender;
    private String genderStr="男";
    private SQLiteDatabase db;

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

        name=(EditText)findViewById(R.id.name);
        age=(EditText)findViewById(R.id.age);
        id=(EditText)findViewById(R.id.id);



        gender=(RadioGroup)findViewById(R.id.gender);
        gender.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
                if(checkedId==R.id.male){
                    genderStr="男";
                }else{
                    genderStr="女";
                }
            }
        });



        //第一个参数:上下文环境
        //第二个参数:如果写一个数据库名称,那这个数据库在私有目录中,即该app项目包下
        //          如果带有sd卡路径,那么数据库在指定路径下,如下path
        // String path= Environment.getExternalStorageDirectory()+"/Emilia";
        //第三个参数:游标工场
        //第四个参数:版本号
        SQLiteOpenHelper helper=new SQLiteOpenHelper(this,"Emilia",null,1) {
            /**
             * 创建数据库
             * @param db
             */
            @Override
            public void onCreate(SQLiteDatabase db) {
                Toast.makeText(MainActivity.this, "数据库创建", Toast.LENGTH_SHORT).show();

                //创建表,如果数据库不存在,会调用onCreate创建数据库
                String sql="create table test_db(_id integer primary key autoincrement,"+
                        "name varchar(20),"+
                        "age integer)";
                db.execSQL(sql);
            }

            /**
             * 数据库升级
             * @param db
             * @param oldVersion
             * @param newVersion
             */
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                Toast.makeText(MainActivity.this, "数据库升级", Toast.LENGTH_SHORT).show();
            }
        };
        //用于获取数据库对象
        //1.数据库存在,则直接打开数据库
        //2.数据库不存在,则调用数据库创建方法,然后打开数据库
        //3.数据库存在,但版本号升高了,则调用数据库升级方法
        db = helper.getReadableDatabase();

    }


    public void operate(View v){
        switch (v.getId()){
            case R.id.insert :
                
                //添加数据操作
                String nameStr=name.getText().toString();
                String ageStr=age.getText().toString();
                //第一种写法 注意这里的写法很奇特
                String sql1="insert into test_db (name,age,gender) values ('"+nameStr+"','"+ageStr+"','"+genderStr+"')";
                db.execSQL(sql1);
                //第二种写法
                // String sql1="insert into test_db (name,age,gender) values (?,?,?)"
                //db.execSQL(sql1,new String[]{nameStr,ageStr,genderStr});
                break;
            case R.id.select :
                break;
            case R.id.delete :
                break;
            case R.id.update :
                break;
        }
    }

}

程序点击添加后崩溃,原因是数据库没有创建

http://img1.sycdn.imooc.com//climg/5a90ca0c000152aa13230468.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你的sql语句中

String sql="create table test_db(_id integer primary key autoincrement,"+
                        "name varchar(20),"+
                        "age integer)";
String sql1="insert into test_db (name,age,gender) values ('"+nameStr+"','"+ageStr+"','"+genderStr+"')";

1)表中并没有gender这个字段。2)age表中的类型是integer,你insert进去的确增加了引号。如果解决了你的疑惑,请采纳,祝学习愉快~

  • 慕UI6705487 提问者 #1
    String sql1="insert into test_db (name,age,gender) values ('"+nameStr+"',"+ageStr+",'"+genderStr+"')"; 改了以后还是不行呀
    2018-02-25 19:10:43
  • 慕UI6705487 提问者 #2
    String sql="create table test_db(_id integer primary key autoincrement,"+ "name varchar(20),"+ "age integer(3),"+ "gender varchar)";
    2018-02-25 19:11:11
  • 好帮手慕雪 回复 提问者 慕UI6705487 #3
    gender varchar(你得给个数呀)
    2018-02-26 10:51:31
irista23 2018-02-27 13:55:19

插入的sql语句有问题,你试试这样就可以插入

insert into test_db  (name,age,gender) values ('Emilia',30,'女')
问题在ageStr前后不应该有单引号,因为age定义的是integer

  • 提问者 慕UI6705487 #1
    老师问题已经解决了,但这里我有点搞不懂这个语句为什么要双引号前后两个加号,感觉怪怪的
    2018-02-27 14:20:55
  • irista23 回复 提问者 慕UI6705487 #2
    加单引号是sql语句的语法代表是字符串
    2018-02-27 14:24:44
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Android网络操作与数据存储2018版
  • 参与学习           人
  • 提交作业       307    份
  • 解答问题       1613    个

本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师