一:在android系统中除了文件和sharedPreferences 可以存储数据外,还可以用SQLite数据库,它是android自带的嵌入式的关系型的数据库,它支持null,Integer,real,text,blod(二进制数据)五种数据类型,但实际运算和保存数据时它可以接受其它数据类型,只是这时候会转换为对应的五种数据类型。 但有一种情况例外:定义为Integer primary key 的字段只能存储64位整数,当向这种字段保存除整数以外的数据时,将会产生错误。另外,SQLite在解析Create Table语句时,会忽略create table语句中跟在字段后面的数据类型信息。
二:在程序初始化时候,必须先建立数据库以对数据库进行更新,所以这里需要继承一个 SQLiteOpenHelper抽象类,这里有两个方法 onCreate(),onUpgreade()两个方法,前者用来创建数据库及对数据库的一些初始化操作,后者是当数据库版本进行更新时候用。下面的例子是创建了一个数据库名为:nyist,版本为 1,的数据库,并在数据库中创建了一个person表。这里利用了构造函数传入了 数据库名和版本名常量,参数为Context 对象。
public class DatebaseHelper extends SQLiteOpenHelper { public final static String NAME="nyist"; public final static int VERSION=1; public DatebaseHelper(Context context) { super(context,NAME,null,VERSION); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL("CREATE TABLE person (personid integer primary key autoincrement,name varchar(20),age integer)");
}
@Override public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) { // TODO Auto-generated method stub db.execSQL("DROP TABLE IF EXISTS person"); onCreate(db);
}
}
三:用SQLiteDatabase来操作SQLite数据库。
这里主要用 exeSQL(),rawQuery()分别用来对insert,delete,update这些对数据库更新的操作,select查询的操作。下面的例子就是CRUD操作。
public class DatebaseService { private DatebaseHelper dbHelper; public DatebaseService(Context context) { this.dbHelper = new DatebaseHelper(context); }
//保存数据。 public void save(Person person){ SQLiteDatabase db=dbHelper.getWritableDatabase(); db.execSQL("insert into person(name,age) values(?,?)",new Object[]{person.getName(),person.getAge()}); }
//更新数据 public void update(Person person){ SQLiteDatabase db=dbHelper.getReadableDatabase(); db.execSQL("update person set name=?,age=? where personid=?",person.getAge(),person.getPersonid()}); }
//查找数据 public Person find(Integer personid){ SQLiteDatabase db=dbHelper.getReadableDatabase(); Cursor cursor=db.rawQuery("select * from person where personid=?",new String[]{personid.toString()} ); while(cursor.moveToNext()){ String name=cursor.getString(cursor.getColumnIndex("name")); int age=cursor.getInt(cursor.getColumnIndex("age")); int id=cursor.getInt(cursor.getColumnIndex("personid")); return new Person(id,name,age);
} return null; }
//删除数据 public void delete(Integer personid){ SQLiteDatabase db=dbHelper.getReadableDatabase(); db.execSQL("delete from person where personid=?",new Object[]{personid}); } public Long getCount(){ SQLiteDatabase db=dbHelper.getReadableDatabase(); Cursor cursor = db.rawQuery("select count(*) from person",null); cursor.moveToFirst(); return cursor.getLong(0); }
//分页显示 返回的是List集合 public List<Person> getScrollData(int offer,int maxResult){ List<Person> persons=new ArrayList<Person>(); SQLiteDatabase db=dbHelper.getReadableDatabase(); Cursor cursor=db.rawQuery("select * from person limit ?,?",new String[]{String.valueOf(offer),String.valueOf(maxResult)}); while(cursor.moveToNext()){ int id=cursor.getInt(cursor.getColumnIndex("personid")); String name=cursor.getString(cursor.getColumnIndex("name")); int age=cursor.getInt(cursor.getColumnIndex("age")); persons.add(new Person(id,age)); } return persons; }
//分页显示 返回的是Cursor游标 public Cursor getCursorScrollData(int offer,int maxResult){ List<Person> persons=new ArrayList<Person>(); SQLiteDatabase db=dbHelper.getReadableDatabase(); Cursor cursor=db.rawQuery("select personid as _id,age from person limit ?,String.valueOf(maxResult)}); return cursor; } } 四:除了exeSQL(),rawQuery()这两个方法外,SQLiteDatabase类也专门提供了一些函数来操作数据库,有 insert,delete,update,query(),不过这些函数需要的参数比较多,只适合对SQL语句不太懂的菜鸟用,对于熟悉SQL语句的程序员最好使用exeSQL(),rawQuery(),这两个方法比较直观明了。
五:调用getWritableDatabase()或getReadableDatabase()方法后,会缓存SQLiteDatabase实例,因为这里是手机应用程序,一般只有一个用户访问数据库,所以建议不关闭数据库,保持连接状态。getWritableDatabase(),getReadableDatabase的区别是当数据库写满时候,调用前者会报错,调用后者不会,所以如果是不是更新数据库的话,最好调用后者来获得数据库连接。
六:关于事务。
当执行两个或多条语句时候,有一条出现错误不能执行,其它的也语句也不能执行。比如银行系统,当转账时候,钱数扣除,转账的号数据错误,这个事务就会中止。
public void payment(){ SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); db.beginTransaction();//开启事务 try{ db.execSQL("update person set amount=amount-10 where personid=?",new Object[]{"1"}); db.execSQL("update person 55set amount=amount+10 where personid=?",new Object[]{"2"}); db.setTransactionSuccessful();//设置事务标志为成功,在结束事务将会提交事务 }finally{ db.endTransaction();//结束事务,默认是回滚事务 } }
原帖地址:http://hi.baidu.com/jlhaoran/item/45ddd51744be01572a3e221f (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|