首页 > 代码库 > Android第十九期 - Sqlite离线存储教你写小米记事本

Android第十九期 - Sqlite离线存储教你写小米记事本

    这期说sqlite离线存储,最近app要加上离线文件下载的功能,自己也是弄了一天,总算是小有成果,要好好感谢老婆的大力支持,帮我测试什么的,都任劳任怨,现在能这样对我这样的好的人只有老婆了。分享代码给大家,看着一些记事本都很实用,所以也就估摸着弄了一个,UI自己设计吧,功能实现了一切都好说。下面开始:

    首先,sqlite可以去官网http://www.sqlite.org/lang.html,去查询所有进行的操作,创建表,增删改查等等。

    wKioL1Q8hzrRc6OcAASOz9FSWeA686.jpg    wKiom1Q8h42DqWJ1AAGP9bo56TI104.jpg    然后就是建一个sqlite的类继承至SQLiteOpenHelper:

package com.liangxiao.usingsqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class Db extends SQLiteOpenHelper {

	public Db(Context context, String name, CursorFactory factory, int version) {
		super(context, "db", null, 1);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		// db.execSQL("CREATE TABLE USER(" + "name TEXT DEFAULT \"\","
		// + "sex TEXT DEFAULT \"\")");
		db.execSQL("CREATE TABLE USER("
				+"_id INTEGER PRIMARY KEY AUTOINCREMENT,"
				+ "name TEXT DEFAULT \"\"," + "sex TEXT DEFAULT \"\")");
		// db.execSQL("CREATE TABLE USER(" + "name TEXT DEFAULT \"\"");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub

	}

}

    注意:这里面的adapter我用了官方自带的方便操作了,所以需求引用表的_id ,就加了一个字段。

    然后是我给大家写了两种读取操作界面,一种是textview的读取,一种是listview的读取方式。

    先说textview,大家可以发挥想象去构造UI,什么下拉悬停,ScrollView等等。

    代码我都注释过PS:跳转窗体到MainActivity_dbRead:

package com.liangxiao.usingsqlite;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity_dbRead extends Activity {
	private TextView xianshi;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main_dbread);
		xianshi = (TextView) findViewById(R.id.xianshi);
		read_db();

	}

	/**
	 * 读取db部分
	 */
	private void read_db() {
		Db db = new Db(this, "db", null, 1);
		SQLiteDatabase dbRead = db.getReadableDatabase();
		Cursor c = dbRead.query("user", null, null, null, null, null, null);
		while (c.moveToNext()) {
			String name = c.getString(c.getColumnIndex("name"));
			String sex = c.getString(c.getColumnIndex("sex"));
			db_lastindex_content += "心情:" + name + "  " + "当事人:" + sex + "\n";
		}
		xianshi.setText(db_lastindex_content.toString());
	}

	private String db_lastindex_content = "";
}

    注意:这个textview你可以在当前的页面显示你的操作,也可以跳转操作,都会直接显示在主UI上,没有卡顿的现象,很流畅的。

    主窗体MainActivity:

package com.liangxiao.usingsqlite;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	private Button btn_fly;
	private TextView xianshi1;
	private EditText add_db_text;
	private EditText add_db_text2;
	private Db db;
	private SQLiteDatabase dbRead, dbWrite;
	private Cursor c;

	// private String add_db_text_string;
	// private String add_db_text_string2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		init();
		read_db();
	}

	/**
	 * 初始化部分
	 */
	private void init() {
		xianshi1 = (TextView) findViewById(R.id.xianshi1);
		btn_fly = (Button) findViewById(R.id.btn_fly);
		add_db_text = (EditText) findViewById(R.id.add_db_text);
		add_db_text2 = (EditText) findViewById(R.id.add_db_text2);

		btn_fly.setOnClickListener(this);
	}

	/**
	 * 添加操作部分
	 */
	private void add_db() {
		String add_db_text_string = add_db_text.getText().toString();
		String add_db_text_string2 = add_db_text2.getText().toString();
		Toast.makeText(this, add_db_text_string + "," + add_db_text_string2, 2)
				.show();
		db = new Db(this, "db", null, 1);
		dbWrite = db.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put("name", add_db_text_string);
		cv.put("sex", add_db_text_string2);
		dbWrite.insert("user", null, cv);
		dbWrite.close();
	}

	/**
	 * 读取db部分
	 */
	private void read_db() {
		db = new Db(this, "db", null, 1);
		dbRead = db.getReadableDatabase();
		c = dbRead.query("user", null, null, null, null, null, null);
		while (c.moveToNext()) {
			String name = c.getString(c.getColumnIndex("name"));
			String sex = c.getString(c.getColumnIndex("sex"));
			System.out.println(String.format("name%s,sex%s", name, sex));
			// xianshi1.setText("心情:" + name + "  " + "当事人:" + sex + "\n");
			db_dateBase += "心情:" + name + "  " + "当事人:" + sex + "\n";

		}
		xianshi1.setText(db_dateBase.toString());
	}

	private String db_dateBase = "";

	private void refresh() {
		db = new Db(this, "db", null, 1);
		dbRead = db.getReadableDatabase();
		c = dbRead.query("user", null, null, null, null, null, null);
		while (c.moveToNext()) {
			String name = c.getString(c.getColumnIndex("name"));
			String sex = c.getString(c.getColumnIndex("sex"));
			System.out.println(String.format("name%s,sex%s", name, sex));
			// xianshi1.setText("心情:" + name + "  " + "当事人:" + sex + "\n");
			db_dateBase = "心情:" + name + "  " + "当事人:" + sex + "\n";

		}
		String xinshi_text_lastindex = xianshi1.getText().toString();
		xianshi1.setText(xinshi_text_lastindex+db_dateBase.toString());

	}

	/**
	 * click部分
	 */
	@Override
	public void onClick(View v) {
		add_db();
		refresh();
		// Intent intent = new Intent();
		// intent.setClass(MainActivity.this, MainActivity_dbRead.class);
		// MainActivity.this.startActivity(intent);
		// MainActivity.this.finish();
	}
}

    注意在onClick中,我注释的部分是跳转的操作,当前的是主窗体的UI显示操作。

    两种效果如下:

wKiom1Q8lhjzhqmVAADFpVlO2Qk485.jpg

wKioL1Q8l9GAQGoVAADKV6sTv4E812.jpg


    然后是对于listview的操作,大家一般都是对于这个操作多些,首先是主窗体MainActivity_ListView_db:

package com.liangxiao.usingsqlite;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity_ListView_db extends ListActivity implements
		OnClickListener {
	private ListView list;
	private EditText edit_name, edit_sex;
	private TextView tvname, tvsex;
	private Button btn;
	private SimpleCursorAdapter adapter;
	private Db db;
	private SQLiteDatabase dbRead, dbWrite;
	private Cursor c;
	private long firstime = 0;
	private RelativeLayout mainLayout;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main_listview);
		init();
		db_add_read();
		refreshListView();
	}

	private void init() {
		btn = (Button) findViewById(R.id.btn);
		// list = (ListView) findViewById(R.id.list);
		edit_name = (EditText) findViewById(R.id.edit_name);
		edit_sex = (EditText) findViewById(R.id.edit_sex);
		btn.setOnClickListener(this);

	}

	private void db_add_read() {
		db = new Db(this, "db", null, 1);
		dbRead = db.getReadableDatabase();
		// c = dbRead.query("user", null, null, null, null, null, null);
		dbWrite = db.getWritableDatabase();
		adapter = new SimpleCursorAdapter(this,
				R.layout.activity_main_listview_item, null, new String[] {
						"name", "sex" }, new int[] { R.id.tvname, R.id.tvsex });
		// list.setAdapter(adapter);
		setListAdapter(adapter);
		// 删除操作部分
		getListView().setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View view,
					final int position, long id) {
				new AlertDialog.Builder(MainActivity_ListView_db.this)
						.setTitle("你妹妹")
						.setMessage("Are you sure?")
						.setNegativeButton("No", null)
						.setPositiveButton("delete",
								new DialogInterface.OnClickListener() {

									@Override
									public void onClick(DialogInterface arg0,
											int arg1) {
										// TODO Auto-generated method stub
										Cursor c = adapter.getCursor();
										c.moveToPosition(position);

										int itemId = c.getInt(c
												.getColumnIndex("_id"));
										dbWrite.delete("user", "_id=?",
												new String[] { itemId + "" });
										refreshListView();
									}
								}).show();

				return true;
			}
		});
		// 修改部分
		getListView().setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				Cursor c = adapter.getCursor();
				c.moveToPosition(position);

				int itemId = c.getInt(c.getColumnIndex("_id"));

				Intent intent = new Intent();
				intent.putExtra("itemId", itemId + "");
				intent.setClass(MainActivity_ListView_db.this,
						MainActivity_ListView_db_detail.class);
				MainActivity_ListView_db.this.startActivity(intent);
				MainActivity_ListView_db.this.finish();
			}
		});
	}

	private void refreshListView() {
		c = dbRead.query("user", null, null, null, null, null, null);
		adapter.changeCursor(c);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (v == btn) {
			ContentValues cv = new ContentValues();
			cv.put("name", edit_name.getText().toString());
			cv.put("sex", edit_sex.getText().toString());
			dbWrite.insert("user", null, cv);
			refreshListView();
			edit_name.getText().clear();
			edit_sex.getText().clear();
		}
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
			// RelativeLayout.LayoutParams lp = (LayoutParams) mainLayout
			// .getLayoutParams();
			long secondtime = System.currentTimeMillis();
			if (secondtime - firstime > 3000) {
				Toast.makeText(MainActivity_ListView_db.this, "再按一次返回键退出",
						Toast.LENGTH_SHORT).show();
				firstime = System.currentTimeMillis();
				return true;
			} else {
				MainActivity_ListView_db.this.finish();
				System.exit(0);
				android.os.Process.killProcess(android.os.Process.myPid());
			}
		}
		return super.onKeyDown(keyCode, event);
	}
}

    然后是编辑MainActivity_ListView_db_detail:

package com.liangxiao.usingsqlite;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity_ListView_db_detail extends Activity {
	private EditText name, sex;
	private Button btn_update;
	private SQLiteDatabase dbRead, dbWrite;
	private String itemId;
	private Cursor c;
	private Db db;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main_listview_detail);
		init();
		Intent intent = getIntent();
		itemId = intent.getStringExtra("itemId");
		c = dbRead.query("user", null, "_id=?", new String[] { itemId }, null,
				null, null);
		// String name1 = c.getString(c.getColumnName(1));
		if (c.moveToFirst()) {
			String name1 = c.getString(c.getColumnIndex("name"));
			String sex1 = c.getString(c.getColumnIndex("sex"));
			name.setText(name1);
			sex.setText(sex1);
		}
		c.close();
	}

	private void init() {
		db = new Db(this, "db", null, 1);
		dbRead = db.getReadableDatabase();
		dbWrite = db.getWritableDatabase();
		name = (EditText) findViewById(R.id.name);
		sex = (EditText) findViewById(R.id.sex);
		btn_update = (Button) findViewById(R.id.btn_update);

		btn_update.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				ContentValues cv = new ContentValues();
				cv.put("name", name.getText().toString());
				cv.put("sex", sex.getText().toString());
				// dbWrite.insert("user", null, cv);
				dbWrite.update("user", cv, "_id=?", new String[] { itemId });
				Intent intent = new Intent(
						MainActivity_ListView_db_detail.this,
						MainActivity_ListView_db.class);
				MainActivity_ListView_db_detail.this.startActivity(intent);
				MainActivity_ListView_db_detail.this.finish();
			}
		});
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
			Intent intent = new Intent(MainActivity_ListView_db_detail.this,
					MainActivity_ListView_db.class);
			MainActivity_ListView_db_detail.this.startActivity(intent);
			MainActivity_ListView_db_detail.this.finish();
		}
		return super.onKeyDown(keyCode, event);
	}
}

    注意:编辑详情的有两个操作,一个是查询所在listview的id的一行记录,还有更新操作。而主窗体是读取和添加的操作。代码里面都写的比较详细,自己看吧,PS:这个里面有2个小操作,一个是listeview item点击,一个是长按,自己试试吧,效果如下图:

wKiom1Q8mBTA6mTnAADKsTbzCVQ956.jpg

wKioL1Q8mEuSiDWbAADUlnCJF3w913.jpg

wKiom1Q8mBTB4LjxAADJYs8ujH0324.jpg

    

    爱老婆,爱生活,爱IT...

wKioL1Q8mHTDBiDSABArQlKWAEA370.jpg


本文出自 “梁肖技术中心” 博客,请务必保留此出处http://liangxiao.blog.51cto.com/3626612/1563815

Android第十九期 - Sqlite离线存储教你写小米记事本