Android平台上,集成了一個嵌入式關係型資料庫—SQLite,SQLite3(版本號)支持 NULL、INTEGER、REAL(浮點數字)、TEXT(字元串文本)和BLOB(二進位對象)數據類型,SQLite可以解析大部分標準SQL語句
SQLiteOpenHelper對資料庫進行管理,提供了兩個重要的方法,分別是
onCreate(SQLiteDatabase db):初次使用軟體時生成資料庫表,SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用於操作資料庫的SQLiteDatabase實例的時候,若資料庫不存在,Android系統會自動生成一個資料庫,
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):升級軟體時更新資料庫表結構
功能實現:
使用android內部的資料庫SQLite添加日記資料庫並進行日記的增、刪、改、查操作
使用Menu菜單彈出菜單項進行添加、刪除操作
主頁面實現一個淡入效果
效果演示:
i
點擊Menu菜單時彈出兩個菜單項
代碼實現:
1:創建資料庫幫助類DBHelper:
下面是png格式的不能夠複製代碼,望大家見諒,但是親們可以看看過程,自己編寫記憶更深。
2:編寫實體類Diary
public class Diary { private int id; private String title;//日記標題 private String content;//內容 private String pubdate; public Diary(String title, String content) { super(); this.title = title; this.content = content; } public Diary(String title, String content, String pubdate) { super(); this.title = title; this.content = content; this.pubdate = pubdate; } getId,setId //顯示日記列表時,標題長度限制
public String getSubTitle() {
if (title.length() > 8)
return title.substring(0, 7) + "……";
return title;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
getContent,setContent,getPubdate,setPubdate方法 }
}
3:編寫對資料庫的操作類
在進行操作時可以使用SQLite內的封裝的增刪改查方法
此是源碼,但是有位元組顏色大小設置,遮蓋了源碼,不方便查看,後面png格式會看得清楚些
public class DiaryDao { private SQLiteDatabase sqLiteDatabase; private DBHelper dbHelper; // 構造方法,帶有context參數,以便下一對象操作 public DiaryDao(Context context){ dbHelper=new DBHelper(context); } public void add(Diary diary) { String sql = "insert into td_diary(title,content,pubdate) values(?,?,?)"; // 得到SQLite資料庫 sqLiteDatabase = dbHelper.getWritableDatabase(); // 執行sql語句 sqLiteDatabase.execSQL(sql,new String[] { diary.getTitle(), diary.getContent(), diary.getPubdate() }); } public void delete(int id) { String sql = "delete from td_diary where id=?"; // 得到SQLite資料庫 sqLiteDatabase = dbHelper.getWritableDatabase(); // 執行sql語句 sqLiteDatabase.execSQL(sql, new String[] { Integer.toString(id) }); } public void update(Diary diary) { String sql = "update td_diary set title=?,content=? where id=?"; // 得到SQLite資料庫 sqLiteDatabase = dbHelper.getWritableDatabase(); sqLiteDatabase.execSQL( sql, new String[] { diary.getTitle(), diary.getContent(), Integer.toString(diary.getId()) }); } public Diary select(int id) { Diary diary =null; String sql="select * from td_diary where id=?"; sqLiteDatabase=dbHelper.getReadableDatabase(); Cursor cursor=sqLiteDatabase.rawQuery(sql, new String[]{Integer.toString(id)}); if(cursor.moveToFirst()){ String title=cursor.getString(cursor.getColumnIndex("title")); String content=cursor.getString(cursor.getColumnIndex("content")); String pubdate=cursor.getString(cursor.getColumnIndex("pubdate")); diary = new Diary(title, content, pubdate); } return diary; } public List<Diary> getAllDiarys(){ List<Diary> list=new ArrayList<Diary>(); sqLiteDatabase=dbHelper.getReadableDatabase(); Cursor cursor=sqLiteDatabase.rawQuery("select * from td_diary", null); while(cursor.moveToNext()){ int id=cursor.getInt(cursor.getColumnIndex("id")); String title=cursor.getString(cursor.getColumnIndex("title")); String content=cursor.getString(cursor.getColumnIndex("content")); String pubdate=cursor.getString(cursor.getColumnIndex("pubdate")); Diary diary = new Diary(title, content, pubdate); diary.setId(id); list.add(diary); } return list; } }
下面的就是截取的代碼圖片格式,不能夠複製代碼,若有用可複製上面的代碼:
增、刪、改、查方法
sqLiteDatabase.insert/delete/update/query
查找所有信息時可以返回Cursor游標類型,給其綁定SimpleCursorAdapter就可獲取值
即:填充列表時用鍵,及資料庫的列名。
4:主頁面的淡入效果,然後幾秒鐘調轉日記列表頁面
public class MainActivity extends Activity {
private ImageView image;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) this.findViewById(R.id.image);
image.setImageResource(R.drawable.tp);
AlphaAnimation animation = new AlphaAnimation(0.0f, 1.0f);//alpha變化範圍
animation.setDuration(3000);//顯示時間
animation.setStartOffset(100);
image.setAnimation(animation);
// 新建一個handler實現演示跳轉
new Handler().postDelayed(new Runnable() {
public void run() {
Intent i = new Intent(MainActivity.this, DiaryActivity.class);
startActivity(i);
}
}, 3000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
5:列表頁面代碼
public class DiaryActivity extends Activity { private ListView listview; private DiaryDao dao = new DiaryDao(this); List<Map<String, Object>> data; List<Diary> diarys; int POSITION = 0; int id=1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_diary); // 查找組件 listview = (ListView) this.findViewById(R.id.listView1); // 創建資料庫操作實例類 data = new ArrayList<Map<String, Object>>(); diarys = new ArrayList<Diary>(); diarys = dao.getAllDiarys(); for (Diary d : diarys) { Map<String, Object> map = new HashMap<String, Object>(); map.put("title", d.getSubTitle()); map.put("pubdate", d.getPubdate()); data.add(map); } SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item_diary, new String[] { "title", "pubdate" }, new int[] { R.id.title, R.id.date }); //綁定適配器 listview.setAdapter(adapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { //點擊列表項時跳轉修改日誌頁面,將當前的日誌信息傳過去。 public void onItemClick(AdapterView<?> a, View v, int position, long l) { Diary diary = diarys.get(position); Intent intent = new Intent(DiaryActivity.this, DiaryUpdateActivity.class); intent.putExtra("id", diary.getId()); intent.putExtra("title", diary.getTitle()); intent.putExtra("content", diary.getContent()); startActivity(intent); } }); listview.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, View v, int arg2, long arg3) { //從資料庫獲得選擇的當前id號 //id = dao.getAllDiarys().get(arg2).getId(); id=(int) arg3;//直接獲取id,內部封裝好的arg3與資料庫id一致 //在列表中位置 POSITION=arg2; } public void onNothingSelected(AdapterView<?> arg0) { } }); } // 菜單刪除操作 private void delete() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setTitle("請確認"); builder.setMessage("確定要刪除第"+(POSITION+1)+"條記錄嗎?"); //點擊確定按鈕則刪除當前的日誌,刷新主頁面,顯示列表 builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { System.out.println("刪除的日誌id是:"+id); dao.delete(id); Intent i = new Intent(); Intent in = new Intent(DiaryActivity.this, DiaryActivity.class); startActivity(in); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); builder.create().show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_diary, menu); menu.getItem(0).setIcon(android.R.drawable.ic_menu_add); menu.getItem(1).setIcon(android.R.drawable.ic_menu_delete); // 簡單的菜單選擇時設置監聽 刪除日誌 /*menu.getItem(1).setOnMenuItemClickListener( new MenuItem.OnMenuItemClickListener() { //@Override public boolean onMenuItemClick(MenuItem item) { delete(); return false; } });*/ // 添加日誌 /*menu.getItem(0).setOnMenuItemClickListener( new MenuItem.OnMenuItemClickListener() { //@Override public boolean onMenuItemClick(MenuItem item) { Intent in = new Intent(DiaryActivity.this, DiaryAddActivity.class); startActivity(in); return false; } });*/ return true; } //重寫菜單選項被選擇時調用方法 @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.delete: delete(); break; case R.id.add: Intent in = new Intent(DiaryActivity.this, DiaryAddActivity.class); startActivity(in); break; } return super.onOptionsItemSelected(item); } }
6:添加或更新日記布局代碼
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="標題" /> <EditText android:id="@+id/tit" android:inputType="text" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="內容" /> <EditText android:id="@+id/cont" android:gravity="top" android:inputType="textMultiLine" android:minLines="4" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/add" android:layout_width="50dp" android:layout_height="40dp" android:text="添加"//保存 /> </LinearLayout>
主頁面布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:text="心語日誌" android:textSize="50dp" android:textColor="#1045ff" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <ImageView android:id="@+id/image" android:layout_height="fill_parent" android:layout_width="fill_parent" /> </LinearLayout>
7。更新日記java代碼:
public class DiaryUpdateActivity extends Activity {
private EditText title;
private EditText content;
private Button save;
private DiaryDao dao;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.update_diary);
// 查找組件
title = (EditText) this.findViewById(R.id.edit1);
content = (EditText) this.findViewById(R.id.edit2);
save = (Button) this.findViewById(R.id.save);
// 獲取上個視圖傳的參數值
Intent i = getIntent();
final int id = i.getIntExtra("id", 0);
System.out.println(id);
// 設置文本
title.setText(i.getStringExtra("title"));
content.setText(i.getStringExtra("content"));
// 添加事件點擊處理監聽
save.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Diary diary = new Diary( title.getText().toString(), content
.getText().toString());
diary.setId(id);
//執行更新
dao=new DiaryDao(DiaryUpdateActivity.this);
dao.update(diary);
//提示
Toast.makeText(DiaryUpdateActivity.this, "保存成功",
Toast.LENGTH_LONG).show();
//更新後跳轉到日誌列表視圖
Intent in = new Intent(DiaryUpdateActivity.this,
DiaryActivity.class);
startActivity(in);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.update_diary, menu);
return true;
}
}
菜單布局代碼:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <group > <item android:id="@+id/add" android:title="添加新的日誌" android:orderInCategory="100" /> <item android:id="@+id/delete" android:title="刪除日誌" android:orderInCategory="100" /> </group> </menu>
列表項的布局代碼:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/title" android:textColor="#228B22" android:textSize="20dp" android:layout_width="wrap_content" android:layout_height="40dp" android:gravity="left" /> <TextView android:id="@+id/date" android:textColor="#340000" android:textSize="18dp" android:layout_width="fill_parent" android:layout_height="40dp" android:gravity="right" /> </LinearLayout>
任何程序都要理清思緒之後再編碼,學習會更加有效率。