現在的位置: 首頁 > 綜合 > 正文

android數據存儲:使用SQLite 開發簡易心情日記

2018年02月16日 ⁄ 綜合 ⁄ 共 10542字 ⁄ 字型大小 評論關閉

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>

 

 

任何程序都要理清思緒之後再編碼,學習會更加有效率。

 

抱歉!評論已關閉.