編輯:關於Android編程
在andorid端使用sqlite數據庫是經常的事,通常來說都是對每個屬性對應一個字段,然後分字段的來讀取,但是今天我要說的不是這樣的。我們通過對象序列化來存取。因為一個好的程序員總是得學會偷懶。
Demo效果
好了看代碼吧。
我們首先還是新建一個對象,然後我們就對這個對象存取。
public class Student implements Serializable { /** * */ private static final long serialVersionUID = 1L; String name; int age; public Student(String name, int age) { super(); 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; } }然後是數據庫的連接類
/*** * 單例模式實現數據庫連接 * @author bobo * */ public class Dbhelper extends SQLiteOpenHelper { private static Dbhelper dbhelper = null; public static Dbhelper getInstens(Context context) { if (dbhelper == null) { dbhelper = new Dbhelper(context); } return dbhelper; } private Dbhelper(Context context) { super(context, datebase.db, null, 1); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub //這張表采用二進制文件存儲對象注意第二個字段我們將對象存取在這裡面 String sql_class_table=create table if not exists classtable(_id integer primary key autoincrement,classtabledata text); db.execSQL(sql_class_table); } @Override public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) { // TODO Auto-generated method stub } }最後是一個數據庫操作類,最主要的方法在這個類裡面,通過二進制流把對象轉換為對象流然後取出二進制存取進數據庫,最後取的時候也一樣。首先取出二進制對象,然後通過流還原對象。
/** * 數據庫操作 * @author bobo * */ public class StudentServcie { Context context; public StudentServcie(Context context) { // TODO Auto-generated constructor stub this.context = context; } /** * 保存 * @param student */ public void saveObject(Student student) { ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); try { ObjectOutputStream objectOutputStream = new ObjectOutputStream(arrayOutputStream); objectOutputStream.writeObject(student); objectOutputStream.flush(); byte data[] = arrayOutputStream.toByteArray(); objectOutputStream.close(); arrayOutputStream.close(); Dbhelper dbhelper = Dbhelper.getInstens(context); SQLiteDatabase database = dbhelper.getWritableDatabase(); database.execSQL(insert into classtable (classtabledata) values(?), new Object[] { data }); database.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Student getObject() { Student student = null; Dbhelper dbhelper = Dbhelper.getInstens(context); SQLiteDatabase database = dbhelper.getReadableDatabase(); Cursor cursor = database.rawQuery(select * from classtable, null); if (cursor != null) { while (cursor.moveToNext()) { byte data[] = cursor.getBlob(cursor.getColumnIndex(classtabledata)); ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(data); try { ObjectInputStream inputStream = new ObjectInputStream(arrayInputStream); student = (Student) inputStream.readObject(); inputStream.close(); arrayInputStream.close(); break;//這裡為了測試就取一個數據 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return student; } }同樣我們也可以對list,或者map對象進行保存,方法跟上面的一樣,但是map或者list裡面的對象必須序列化。
最後給出測試類。
public class MainActivity extends Activity { StudentServcie servcie; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); servcie = new StudentServcie(this); } public void onclick(View view) { switch (view.getId()) { case R.id.save: servcie.saveObject(new Student(李雷, 20)); Toast.makeText(this, 存取完成, 0).show(); break; case R.id.load: Student student = servcie.getObject(); if(student!=null) Toast.makeText(this, student.getName()+student.getAge(), 0).show(); break; } } }
[html]復制代碼 代碼如下:/** * 畫一個圓角圖 * 
有時候作為非官方開發的APP集成了官方的所有信息,但是現在需要實現另一個功能那就是登錄發表評論到官方的網站,而非官方的APP並不知道官方網站是怎麼實現登錄與評論的,而且越
下拉菜單美團首頁類似的下拉彈出菜單工程中經常遇到的控件,不同工程中菜單條目的類型與數量也不一樣所以需要根據實際需要填充不同內容。先寫個demo,一倍不時之需吧。既然每個項
Android系統架構Linux內核層。Android系統是基於Linux 2.6內核的,這一層為Android設備的各種硬件提供了底層的驅動,如顯示驅動、音頻驅動、照相