Android数据库入门小案例SQLiteOpenHelper和SQLiteDatabase使用

版权声明:支持原创,注明出处。 https://blog.csdn.net/qq_38584967/article/details/78796945

前言

这是一次上机实验,对的没错,刚开始没有用数据库,只是使用Intent Bundle传递数据而已,后面又让我们使用数据库存放数据。所以代码都在一起,可能有些代码并没有什么用(经供参考),但是代码量不大,不用担心,数据库的使用并没有开源数据库框架,比如LitePal(代码少,好用),因为还是菜鸟,使用一开始还是先基础,后面可以改良。本着分享学习的心情,话多了,请大家坚持学习。若是措辞不清大家自接看源码吧,我放在文末了,下面是实验内容。
理解Bundle、Intent和Activity概念,掌握从一个Activity启动另一个Activity并返回结果的编程方法。
1、理解Android的数据存储方法的相关概念。
2、掌握SQLiteOpenHelper和SQLiteDatabase的常用方法。
3、掌握Android数据库应用的开发。

这里写图片描述

这里写图片描述

正文

知识主要有以下几点:
1.使用Bundle Intent

                person = new Person(name.getText().toString());
                Bundle myBundle = new Bundle();
                myBundle.putSerializable("person",person);//将person序列化并放入bundle。
                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                intent.putExtra("myBundle", myBundle);
                startActivityForResult(intent, requestCode);//表示需要下个活动返回结果,requestCode相当于识别码

不直接使用Intent传数据而使用Bundl传递数据的好处不言而喻,
person是我用来存放人信息类的对象,要序列化记得person类实现接口serializable即可。取值按存放的名称取就可以 Bundle bundle = getIntent().getBundleExtra("myBundle");
person = (Person) bundle.getSerializable("person");


当下个活动返回结果时 setResult(resultCode, intent);就会回调进入onActivityResult(int requestCode, int resultCode, Intent data)方法,在里面实现在界面上显示界面就可以,resultCode也是返回活动的标识码。

2.讲一讲数据库实现,自定义类继承MyDatabaseHelper extends SQLiteOpenHelper ,并且重写它的两个方法就可以。主要是
1)考虑到两个活动都需要使用同一个数据库,于是我对MyDatabaseHelper 类使用了单例模式


public class MyDatabaseHelper extends SQLiteOpenHelper {

    public static int a = 1;//用以验证db的创建

    private Context mContext;

    volatile private static MyDatabaseHelper dbHelper = null;

    public static final String CREATE_USER = "create table User ("
            + "id integer primary key autoincrement, "
            + "name text, "
            + "age integer, "
            + "profession text, "
            + "tel text)";

    private MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
        super(context, name, factory, version);
//        mContext = context;
    }

    public static MyDatabaseHelper getInstance() {
        try {
            if(dbHelper != null){//懒汉式

            }else{
                //创建实例之前可能会有一些准备性的耗时工作
                Thread.sleep(300);
                synchronized (MyDatabaseHelper.class) {
                    if(dbHelper == null){//二次检查
                        dbHelper = new MyDatabaseHelper(
                                MyApplicationContext.getAppContext(), "UserStore.db", null, 1);
//                        需要传入Context,此处是静态方法,所以需要MyApplicationContext类,
//                        需要先去AndroidManifest.xml文件定义MyApplicationContext
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return dbHelper;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_USER);
        a = 3;
//        Toast.makeText(mContext, "创建成功1111", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists User");
        onCreate(db);
    }
}

然后遇见一个问题dbHelper = new MyDatabaseHelper(MyApplicationContext.getAppContext(), “UserStore.db”, null, 1);
该构造方法第一个传入的必须为上下文类型的,使用单例模式静态下是无法得到当前活动等上下文环境的,所以我写了一个类MyApplicationContext继承Application,这样就可以传入app的上下文了

public class MyApplicationContext extends Application {
    private static Context context;

    public void onCreate(){
        super.onCreate();
        MyApplicationContext.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return MyApplicationContext.context;
    }
}

虽然东西不多,但写文章的时候旁边有点乱,大家要是觉得云里雾里还是看我代码吧。
https://github.com/jianhaojiang/SQLiteTest
参考文章:
Android中获得上下文的静态方法http://blog.csdn.net/u013378266/article/details/46560349

猜你喜欢

转载自blog.csdn.net/qq_38584967/article/details/78796945