android sqlite存对象,【Android基础】Android SQLite存储自定义对象

Android SQLite存储自定义对象

在SQLite数据库中可存储的数据类型有NULL、INTEGER、REAL(浮点型)、TEXT、BOOL,一共是五种数据类型。在Android开发中,我们存储数据的一般的作法是数据库的属性就是类的成员变量,比如:

要存储一个人的姓名和年龄,在类中的是将它们定义为两个成员变量

class Person{

private String name;

private int age;

}

数据库中是将它们存储为两个字段

- name TEXT

- age INTEGER

现在我要介绍的这种方法是直接把Persond1实例存储在数据库里,也就是在数据库中存储对象。

具体做法是:将对象序列化为字节流字符串,然后将字节流字符串以TEXT类型存储在数据库中;在取数据时,将字节流反序列化为对象就行了。所以我们的实体类得是实现了Serializable接口的类。

下面是实例(下载):

首先是Person类,这是我们存储的实体类,只有set和get方法,并且实现了序列化接口

package com.databasetest;

import java.io.Serializable;

@SuppressWarnings("serial")

public class Person implements Serializable{

private String name;

private int age;

public Person(){

this("",0);//默认值

}

public Person(String name, int age){

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

然后是数据库的辅助类

package com.db;

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;

public class DBServices extends SQLiteOpenHelper{

public final static int version = 1;

public final static String dbName = "Test";

public DBServices(Context context){

super(context,dbName,null,version);

}

@Override

public void onCreate(SQLiteDatabase db) {

// TODO Auto-generated method stub

db.beginTransaction();

//创建邮件表

String create_mail_sql = "CREATE TABLE if not exists [Test]"+

"(_id integer primary key autoincrement,person text)";

db.execSQL(create_mail_sql);

db.setTransactionSuccessful();

db.endTransaction();

}

@Override

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

// TODO Auto-generated method stub

}

}

接下来是实例界面,有两个输入框用来输入姓名和年龄,一个按钮用于确认,还有一个列表显示数据库中存储的信息

这是layout文件:

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/LinearLayout1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.databasetest.MainActivity" >

android:id="@+id/editText1"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:ems="10"

android:hint="姓名" />

android:id="@+id/editText2"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:ems="10"

android:hint="年龄" >

android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="确定添加" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical" >

android:id="@+id/listView1"

android:layout_width="match_parent"

android:layout_height="fill_parent" >

最后就是MainActivity

其中saveData方法用于存储对象;getAllObject用于获取数据库中所有的Person对象。

public class MainActivity extends ActionBarActivity {

EditText tv1;

EditText tv2;

Button btn;

ListView lv;

ArrayList<String> array = new ArrayList<String>();

ArrayAdapter<String> adapter;

DBServices db = new DBServices(this);

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//获取控件

tv1 = (EditText)findViewById(R.id.editText1);

tv2 = (EditText)findViewById(R.id.editText2);

btn = (Button)findViewById(R.id.button1);

lv = (ListView)findViewById(R.id.listView1);

//初始化数据库中的数据

initDB();

btn.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

String name = tv1.getText().toString();

String age = tv2.getText().toString();

int nAge = 0;

try{

nAge = Integer.valueOf(age);

}catch(NumberFormatException exception){

exception.printStackTrace();

nAge = 0;

}

Person person = new Person(name,Integer.valueOf(age));

array.add(name+" - "+age);

saveData(person);

lv.invalidateViews();

}

});

}

private void initDB(){

db = new DBServices(this);

ArrayList<Person> persons = this.getAllObject();

for(int i=0;i<persons.size();i++){

String object = persons.get(i).getName()

+ " - "

+ persons.get(i).getAge();

this.array.add(object);

}

adapter = new ArrayAdapter<String>(this,

android.R.layout.simple_expandable_list_item_1,array);

lv.setAdapter(adapter);

}

/**

* 保存数据

* @param student

*/

public void saveData(Person person) {

ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();

try {

ObjectOutputStream objectOutputStream = new ObjectOutputStream(arrayOutputStream);

objectOutputStream.writeObject(person);

objectOutputStream.flush();

byte data[] = arrayOutputStream.toByteArray();

objectOutputStream.close();

arrayOutputStream.close();

SQLiteDatabase database = db.getWritableDatabase();

database.execSQL("insert into Test (person) values(?)", new Object[] { data });

database.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public ArrayList<Person> getAllObject() {

ArrayList<Person> persons = new ArrayList<Person>();

SQLiteDatabase database = db.getReadableDatabase();

Cursor cursor = database.rawQuery("select * from Test", null);

if (cursor != null) {

while (cursor.moveToNext()) {

Log.d("data-id",cursor.getString(0));

byte data[] = cursor.getBlob(cursor.getColumnIndex("person"));

ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(data);

try {

ObjectInputStream inputStream = new ObjectInputStream(arrayInputStream);

Person person = (Person) inputStream.readObject();

persons.add(person);

inputStream.close();

arrayInputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

Log.d("Persons-Count",Integer.toString(persons.size()));

return persons;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值