這期說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,如需轉載請自行聯系原作者