这期说sqlite离线存储,最近app要加上离线文件下载的功能,自己也是弄了一天,总算是小有成果,要好好感谢老婆的大力支持,帮我测试什么的,都任劳任怨,现在能这样对我这样的好的人只有老婆了。分享代码给大家,看着一些记事本都很实用,所以也就估摸着弄了一个,UI自己设计吧,功能实现了一切都好说。下面开始:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<code>package</code> <code>com.liangxiao.usingsqlite;</code>
<code>import</code> <code>android.content.Context;</code>
<code>import</code> <code>android.database.sqlite.SQLiteDatabase;</code>
<code>import</code> <code>android.database.sqlite.SQLiteDatabase.CursorFactory;</code>
<code>import</code> <code>android.database.sqlite.SQLiteOpenHelper;</code>
<code>public</code> <code>class</code> <code>Db </code><code>extends</code> <code>SQLiteOpenHelper {</code>
<code> </code><code>public</code> <code>Db(Context context, String name, CursorFactory factory, </code><code>int</code> <code>version) {</code>
<code> </code><code>super</code><code>(context, </code><code>"db"</code><code>, </code><code>null</code><code>, </code><code>1</code><code>);</code>
<code> </code><code>// TODO Auto-generated constructor stub</code>
<code> </code><code>}</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>onCreate(SQLiteDatabase db) {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>// db.execSQL("CREATE TABLE USER(" + "name TEXT DEFAULT \"\","</code>
<code> </code><code>// + "sex TEXT DEFAULT \"\")");</code>
<code> </code><code>db.execSQL(</code><code>"CREATE TABLE USER("</code>
<code> </code><code>+</code><code>"_id INTEGER PRIMARY KEY AUTOINCREMENT,"</code>
<code> </code><code>+ </code><code>"name TEXT DEFAULT \"\","</code> <code>+ </code><code>"sex TEXT DEFAULT \"\")"</code><code>);</code>
<code> </code><code>// db.execSQL("CREATE TABLE USER(" + "name TEXT DEFAULT \"\"");</code>
<code> </code><code>public</code> <code>void</code> <code>onUpgrade(SQLiteDatabase db, </code><code>int</code> <code>oldVersion, </code><code>int</code> <code>newVersion) {</code>
<code>}</code>
注意:这里面的adapter我用了官方自带的方便操作了,所以需求引用表的_id ,就加了一个字段。
然后是我给大家写了两种读取操作界面,一种是textview的读取,一种是listview的读取方式。
先说textview,大家可以发挥想象去构造UI,什么下拉悬停,ScrollView等等。
代码我都注释过PS:跳转窗体到MainActivity_dbRead:
33
34
35
36
37
<code>import</code> <code>android.app.Activity;</code>
<code>import</code> <code>android.database.Cursor;</code>
<code>import</code> <code>android.os.Bundle;</code>
<code>import</code> <code>android.widget.TextView;</code>
<code>public</code> <code>class</code> <code>MainActivity_dbRead </code><code>extends</code> <code>Activity {</code>
<code> </code><code>private</code> <code>TextView xianshi;</code>
<code> </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>
<code> </code><code>super</code><code>.onCreate(savedInstanceState);</code>
<code> </code><code>setContentView(R.layout.activity_main_dbread);</code>
<code> </code><code>xianshi = (TextView) findViewById(R.id.xianshi);</code>
<code> </code><code>read_db();</code>
<code> </code><code>/**</code>
<code> </code><code>* 读取db部分</code>
<code> </code><code>*/</code>
<code> </code><code>private</code> <code>void</code> <code>read_db() {</code>
<code> </code><code>Db db = </code><code>new</code> <code>Db(</code><code>this</code><code>, </code><code>"db"</code><code>, </code><code>null</code><code>, </code><code>1</code><code>);</code>
<code> </code><code>SQLiteDatabase dbRead = db.getReadableDatabase();</code>
<code> </code><code>Cursor c = dbRead.query(</code><code>"user"</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>);</code>
<code> </code><code>while</code> <code>(c.moveToNext()) {</code>
<code> </code><code>String name = c.getString(c.getColumnIndex(</code><code>"name"</code><code>));</code>
<code> </code><code>String sex = c.getString(c.getColumnIndex(</code><code>"sex"</code><code>));</code>
<code> </code><code>db_lastindex_content += </code><code>"心情:"</code> <code>+ name + </code><code>" "</code> <code>+ </code><code>"当事人:"</code> <code>+ sex + </code><code>"\n"</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>xianshi.setText(db_lastindex_content.toString());</code>
<code> </code><code>private</code> <code>String db_lastindex_content = </code><code>""</code><code>;</code>
注意:这个textview你可以在当前的页面显示你的操作,也可以跳转操作,都会直接显示在主UI上,没有卡顿的现象,很流畅的。
主窗体MainActivity:
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<code>import</code> <code>android.content.ContentValues;</code>
<code>import</code> <code>android.content.Intent;</code>
<code>import</code> <code>android.view.View;</code>
<code>import</code> <code>android.view.View.OnClickListener;</code>
<code>import</code> <code>android.widget.Button;</code>
<code>import</code> <code>android.widget.EditText;</code>
<code>import</code> <code>android.widget.Toast;</code>
<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>Activity </code><code>implements</code> <code>OnClickListener {</code>
<code> </code><code>private</code> <code>Button btn_fly;</code>
<code> </code><code>private</code> <code>TextView xianshi1;</code>
<code> </code><code>private</code> <code>EditText add_db_text;</code>
<code> </code><code>private</code> <code>EditText add_db_text2;</code>
<code> </code><code>private</code> <code>Db db;</code>
<code> </code><code>private</code> <code>SQLiteDatabase dbRead, dbWrite;</code>
<code> </code><code>private</code> <code>Cursor c;</code>
<code> </code><code>// private String add_db_text_string;</code>
<code> </code><code>// private String add_db_text_string2;</code>
<code> </code><code>setContentView(R.layout.activity_main);</code>
<code> </code><code>init();</code>
<code> </code><code>* 初始化部分</code>
<code> </code><code>private</code> <code>void</code> <code>init() {</code>
<code> </code><code>xianshi1 = (TextView) findViewById(R.id.xianshi1);</code>
<code> </code><code>btn_fly = (Button) findViewById(R.id.btn_fly);</code>
<code> </code><code>add_db_text = (EditText) findViewById(R.id.add_db_text);</code>
<code> </code><code>add_db_text2 = (EditText) findViewById(R.id.add_db_text2);</code>
<code> </code><code>btn_fly.setOnClickListener(</code><code>this</code><code>);</code>
<code> </code><code>* 添加操作部分</code>
<code> </code><code>private</code> <code>void</code> <code>add_db() {</code>
<code> </code><code>String add_db_text_string = add_db_text.getText().toString();</code>
<code> </code><code>String add_db_text_string2 = add_db_text2.getText().toString();</code>
<code> </code><code>Toast.makeText(</code><code>this</code><code>, add_db_text_string + </code><code>","</code> <code>+ add_db_text_string2, </code><code>2</code><code>)</code>
<code> </code><code>.show();</code>
<code> </code><code>db = </code><code>new</code> <code>Db(</code><code>this</code><code>, </code><code>"db"</code><code>, </code><code>null</code><code>, </code><code>1</code><code>);</code>
<code> </code><code>dbWrite = db.getWritableDatabase();</code>
<code> </code><code>ContentValues cv = </code><code>new</code> <code>ContentValues();</code>
<code> </code><code>cv.put(</code><code>"name"</code><code>, add_db_text_string);</code>
<code> </code><code>cv.put(</code><code>"sex"</code><code>, add_db_text_string2);</code>
<code> </code><code>dbWrite.insert(</code><code>"user"</code><code>, </code><code>null</code><code>, cv);</code>
<code> </code><code>dbWrite.close();</code>
<code> </code><code>dbRead = db.getReadableDatabase();</code>
<code> </code><code>c = dbRead.query(</code><code>"user"</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>);</code>
<code> </code><code>System.out.println(String.format(</code><code>"name%s,sex%s"</code><code>, name, sex));</code>
<code> </code><code>// xianshi1.setText("心情:" + name + " " + "当事人:" + sex + "\n");</code>
<code> </code><code>db_dateBase += </code><code>"心情:"</code> <code>+ name + </code><code>" "</code> <code>+ </code><code>"当事人:"</code> <code>+ sex + </code><code>"\n"</code><code>;</code>
<code> </code><code>xianshi1.setText(db_dateBase.toString());</code>
<code> </code><code>private</code> <code>String db_dateBase = </code><code>""</code><code>;</code>
<code> </code><code>private</code> <code>void</code> <code>refresh() {</code>
<code> </code><code>db_dateBase = </code><code>"心情:"</code> <code>+ name + </code><code>" "</code> <code>+ </code><code>"当事人:"</code> <code>+ sex + </code><code>"\n"</code><code>;</code>
<code> </code><code>String xinshi_text_lastindex = xianshi1.getText().toString();</code>
<code> </code><code>xianshi1.setText(xinshi_text_lastindex+db_dateBase.toString());</code>
<code> </code><code>* click部分</code>
<code> </code><code>public</code> <code>void</code> <code>onClick(View v) {</code>
<code> </code><code>add_db();</code>
<code> </code><code>refresh();</code>
<code> </code><code>// Intent intent = new Intent();</code>
<code> </code><code>// intent.setClass(MainActivity.this, MainActivity_dbRead.class);</code>
<code> </code><code>// MainActivity.this.startActivity(intent);</code>
<code> </code><code>// MainActivity.this.finish();</code>
注意在onClick中,我注释的部分是跳转的操作,当前的是主窗体的UI显示操作。
两种效果如下:
<a href="http://s3.51cto.com/wyfs02/M02/4C/65/wKiom1Q8lhjzhqmVAADFpVlO2Qk485.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/4C/66/wKioL1Q8l9GAQGoVAADKV6sTv4E812.jpg" target="_blank"></a>
然后是对于listview的操作,大家一般都是对于这个操作多些,首先是主窗体MainActivity_ListView_db:
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<code>import</code> <code>android.app.AlertDialog;</code>
<code>import</code> <code>android.app.ListActivity;</code>
<code>import</code> <code>android.content.DialogInterface;</code>
<code>import</code> <code>android.view.KeyEvent;</code>
<code>import</code> <code>android.widget.AdapterView;</code>
<code>import</code> <code>android.widget.AdapterView.OnItemClickListener;</code>
<code>import</code> <code>android.widget.AdapterView.OnItemLongClickListener;</code>
<code>import</code> <code>android.widget.ListView;</code>
<code>import</code> <code>android.widget.RelativeLayout;</code>
<code>import</code> <code>android.widget.RelativeLayout.LayoutParams;</code>
<code>import</code> <code>android.widget.SimpleCursorAdapter;</code>
<code>public</code> <code>class</code> <code>MainActivity_ListView_db </code><code>extends</code> <code>ListActivity </code><code>implements</code>
<code> </code><code>OnClickListener {</code>
<code> </code><code>private</code> <code>ListView list;</code>
<code> </code><code>private</code> <code>EditText edit_name, edit_sex;</code>
<code> </code><code>private</code> <code>TextView tvname, tvsex;</code>
<code> </code><code>private</code> <code>Button btn;</code>
<code> </code><code>private</code> <code>SimpleCursorAdapter adapter;</code>
<code> </code><code>private</code> <code>long</code> <code>firstime = </code><code>0</code><code>;</code>
<code> </code><code>private</code> <code>RelativeLayout mainLayout;</code>
<code> </code><code>setContentView(R.layout.activity_main_listview);</code>
<code> </code><code>db_add_read();</code>
<code> </code><code>refreshListView();</code>
<code> </code><code>btn = (Button) findViewById(R.id.btn);</code>
<code> </code><code>// list = (ListView) findViewById(R.id.list);</code>
<code> </code><code>edit_name = (EditText) findViewById(R.id.edit_name);</code>
<code> </code><code>edit_sex = (EditText) findViewById(R.id.edit_sex);</code>
<code> </code><code>btn.setOnClickListener(</code><code>this</code><code>);</code>
<code> </code><code>private</code> <code>void</code> <code>db_add_read() {</code>
<code> </code><code>// c = dbRead.query("user", null, null, null, null, null, null);</code>
<code> </code><code>adapter = </code><code>new</code> <code>SimpleCursorAdapter(</code><code>this</code><code>,</code>
<code> </code><code>R.layout.activity_main_listview_item, </code><code>null</code><code>, </code><code>new</code> <code>String[] {</code>
<code> </code><code>"name"</code><code>, </code><code>"sex"</code> <code>}, </code><code>new</code> <code>int</code><code>[] { R.id.tvname, R.id.tvsex });</code>
<code> </code><code>// list.setAdapter(adapter);</code>
<code> </code><code>setListAdapter(adapter);</code>
<code> </code><code>// 删除操作部分</code>
<code> </code><code>getListView().setOnItemLongClickListener(</code><code>new</code> <code>OnItemLongClickListener() {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>boolean</code> <code>onItemLongClick(AdapterView<?> parent, View view,</code>
<code> </code><code>final</code> <code>int</code> <code>position, </code><code>long</code> <code>id) {</code>
<code> </code><code>new</code> <code>AlertDialog.Builder(MainActivity_ListView_db.</code><code>this</code><code>)</code>
<code> </code><code>.setTitle(</code><code>"你妹妹"</code><code>)</code>
<code> </code><code>.setMessage(</code><code>"Are you sure?"</code><code>)</code>
<code> </code><code>.setNegativeButton(</code><code>"No"</code><code>, </code><code>null</code><code>)</code>
<code> </code><code>.setPositiveButton(</code><code>"delete"</code><code>,</code>
<code> </code><code>new</code> <code>DialogInterface.OnClickListener() {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>onClick(DialogInterface arg0,</code>
<code> </code><code>int</code> <code>arg1) {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>Cursor c = adapter.getCursor();</code>
<code> </code><code>c.moveToPosition(position);</code>
<code> </code><code>int</code> <code>itemId = c.getInt(c</code>
<code> </code><code>.getColumnIndex(</code><code>"_id"</code><code>));</code>
<code> </code><code>dbWrite.delete(</code><code>"user"</code><code>, </code><code>"_id=?"</code><code>,</code>
<code> </code><code>new</code> <code>String[] { itemId + </code><code>""</code> <code>});</code>
<code> </code><code>refreshListView();</code>
<code> </code><code>}</code>
<code> </code><code>}).show();</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>});</code>
<code> </code><code>// 修改部分</code>
<code> </code><code>getListView().setOnItemClickListener(</code><code>new</code> <code>OnItemClickListener() {</code>
<code> </code><code>public</code> <code>void</code> <code>onItemClick(AdapterView<?> parent, View view,</code>
<code> </code><code>int</code> <code>position, </code><code>long</code> <code>id) {</code>
<code> </code><code>Cursor c = adapter.getCursor();</code>
<code> </code><code>c.moveToPosition(position);</code>
<code> </code><code>int</code> <code>itemId = c.getInt(c.getColumnIndex(</code><code>"_id"</code><code>));</code>
<code> </code><code>Intent intent = </code><code>new</code> <code>Intent();</code>
<code> </code><code>intent.putExtra(</code><code>"itemId"</code><code>, itemId + </code><code>""</code><code>);</code>
<code> </code><code>intent.setClass(MainActivity_ListView_db.</code><code>this</code><code>,</code>
<code> </code><code>MainActivity_ListView_db_detail.</code><code>class</code><code>);</code>
<code> </code><code>MainActivity_ListView_db.</code><code>this</code><code>.startActivity(intent);</code>
<code> </code><code>MainActivity_ListView_db.</code><code>this</code><code>.finish();</code>
<code> </code><code>private</code> <code>void</code> <code>refreshListView() {</code>
<code> </code><code>adapter.changeCursor(c);</code>
<code> </code><code>if</code> <code>(v == btn) {</code>
<code> </code><code>ContentValues cv = </code><code>new</code> <code>ContentValues();</code>
<code> </code><code>cv.put(</code><code>"name"</code><code>, edit_name.getText().toString());</code>
<code> </code><code>cv.put(</code><code>"sex"</code><code>, edit_sex.getText().toString());</code>
<code> </code><code>dbWrite.insert(</code><code>"user"</code><code>, </code><code>null</code><code>, cv);</code>
<code> </code><code>refreshListView();</code>
<code> </code><code>edit_name.getText().clear();</code>
<code> </code><code>edit_sex.getText().clear();</code>
<code> </code><code>public</code> <code>boolean</code> <code>onKeyDown(</code><code>int</code> <code>keyCode, KeyEvent event) {</code>
<code> </code><code>if</code> <code>(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == </code><code>0</code><code>) {</code>
<code> </code><code>// RelativeLayout.LayoutParams lp = (LayoutParams) mainLayout</code>
<code> </code><code>// .getLayoutParams();</code>
<code> </code><code>long</code> <code>secondtime = System.currentTimeMillis();</code>
<code> </code><code>if</code> <code>(secondtime - firstime > </code><code>3000</code><code>) {</code>
<code> </code><code>Toast.makeText(MainActivity_ListView_db.</code><code>this</code><code>, </code><code>"再按一次返回键退出"</code><code>,</code>
<code> </code><code>Toast.LENGTH_SHORT).show();</code>
<code> </code><code>firstime = System.currentTimeMillis();</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>System.exit(</code><code>0</code><code>);</code>
<code> </code><code>android.os.Process.killProcess(android.os.Process.myPid());</code>
<code> </code><code>return</code> <code>super</code><code>.onKeyDown(keyCode, event);</code>
然后是编辑MainActivity_ListView_db_detail:
<code>public</code> <code>class</code> <code>MainActivity_ListView_db_detail </code><code>extends</code> <code>Activity {</code>
<code> </code><code>private</code> <code>EditText name, sex;</code>
<code> </code><code>private</code> <code>Button btn_update;</code>
<code> </code><code>private</code> <code>String itemId;</code>
<code> </code><code>setContentView(R.layout.activity_main_listview_detail);</code>
<code> </code><code>Intent intent = getIntent();</code>
<code> </code><code>itemId = intent.getStringExtra(</code><code>"itemId"</code><code>);</code>
<code> </code><code>c = dbRead.query(</code><code>"user"</code><code>, </code><code>null</code><code>, </code><code>"_id=?"</code><code>, </code><code>new</code> <code>String[] { itemId }, </code><code>null</code><code>,</code>
<code> </code><code>null</code><code>, </code><code>null</code><code>);</code>
<code> </code><code>// String name1 = c.getString(c.getColumnName(1));</code>
<code> </code><code>if</code> <code>(c.moveToFirst()) {</code>
<code> </code><code>String name1 = c.getString(c.getColumnIndex(</code><code>"name"</code><code>));</code>
<code> </code><code>String sex1 = c.getString(c.getColumnIndex(</code><code>"sex"</code><code>));</code>
<code> </code><code>name.setText(name1);</code>
<code> </code><code>sex.setText(sex1);</code>
<code> </code><code>c.close();</code>
<code> </code><code>name = (EditText) findViewById(R.id.name);</code>
<code> </code><code>sex = (EditText) findViewById(R.id.sex);</code>
<code> </code><code>btn_update = (Button) findViewById(R.id.btn_update);</code>
<code> </code><code>btn_update.setOnClickListener(</code><code>new</code> <code>View.OnClickListener() {</code>
<code> </code><code>public</code> <code>void</code> <code>onClick(View arg0) {</code>
<code> </code><code>ContentValues cv = </code><code>new</code> <code>ContentValues();</code>
<code> </code><code>cv.put(</code><code>"name"</code><code>, name.getText().toString());</code>
<code> </code><code>cv.put(</code><code>"sex"</code><code>, sex.getText().toString());</code>
<code> </code><code>// dbWrite.insert("user", null, cv);</code>
<code> </code><code>dbWrite.update(</code><code>"user"</code><code>, cv, </code><code>"_id=?"</code><code>, </code><code>new</code> <code>String[] { itemId });</code>
<code> </code><code>Intent intent = </code><code>new</code> <code>Intent(</code>
<code> </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>,</code>
<code> </code><code>MainActivity_ListView_db.</code><code>class</code><code>);</code>
<code> </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>.startActivity(intent);</code>
<code> </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>.finish();</code>
<code> </code><code>Intent intent = </code><code>new</code> <code>Intent(MainActivity_ListView_db_detail.</code><code>this</code><code>,</code>
<code> </code><code>MainActivity_ListView_db.</code><code>class</code><code>);</code>
<code> </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>.startActivity(intent);</code>
<code> </code><code>MainActivity_ListView_db_detail.</code><code>this</code><code>.finish();</code>
注意:编辑详情的有两个操作,一个是查询所在listview的id的一行记录,还有更新操作。而主窗体是读取和添加的操作。代码里面都写的比较详细,自己看吧,PS:这个里面有2个小操作,一个是listeview item点击,一个是长按,自己试试吧,效果如下图:
<a href="http://s3.51cto.com/wyfs02/M00/4C/65/wKiom1Q8mBTA6mTnAADKsTbzCVQ956.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/4C/66/wKioL1Q8mEuSiDWbAADUlnCJF3w913.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/4C/65/wKiom1Q8mBTB4LjxAADJYs8ujH0324.jpg" target="_blank"></a>
本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/liangxiao/1563815,如需转载请自行联系原作者