前言
这是一次上机实验,对的没错,刚开始没有用数据库,只是使用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