編輯:關於Android編程
SQLite數據庫是android系統內嵌的數據庫,小巧強大,能夠滿足大多數SQL語句的處理工作,而SQLite數據庫僅僅是個文件而已。雖然SQLite的有點很多,但並不是如同PC端的mysql般強大,而且android系統中不允許通過JDBC操作遠程數據庫,所以只能通過webservice等手段於php、servlet交互獲取數據。
基礎
SQLiteDatabase類,代表了一個數據庫對象,通過SQLiteDatabase來操作管理數據庫。
一些基本的用法:
通過這些靜態方法可以很方便的打開和新建一個數據庫。
這些函數可以完成SQL功能,對於查詢出來的結果是用Cursor表示的,類似於JDBC中的ResultSet類,在這些類中通過方法move(int offset)、moveToFirst()、moveToLast()、moveToNext()、moveToPosition(int position)、moveToPrivious()獲取需要的結果行。
下面通過一個實例來說明一下SQLiteDatabase的基本使用:
main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".Main" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="key" /> <EditText android:id="@+id/keys" android:layout_width="100sp" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="value" /> <EditText android:id="@+id/values" android:layout_width="100sp" android:layout_height="wrap_content" /> <Button android:id="@+id/btn" android:layout_width="100sp" android:layout_height="wrap_content" android:text="submit" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
用於填充數據的mytextview.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/listkey" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" /> <TextView android:id="@+id/listvalue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="300sp" /> </LinearLayout>
Main.java
package com.app.main; import android.annotation.SuppressLint; import android.app.Activity; 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.CursorAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class Main extends Activity { EditText ed1 = null; EditText ed2 = null; Button btn = null; ListView lv = null; SQLiteDatabase db = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ed1 = (EditText) this.findViewById(R.id.keys); ed2 = (EditText) this.findViewById(R.id.values); btn = (Button) this.findViewById(R.id.btn); lv = (ListView) this.findViewById(R.id.lv); db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString() + "/my.db3", null); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { String key = ed1.getText().toString(); String value = ed2.getText().toString(); try { insertData(db, key, value); Cursor cursor = db.rawQuery("select * from tb_info", null); inflateListView(cursor); } catch (Exception e) { String sql = "create table tb_info(_id integer primary key autoincrement,db_key varchar(20),db_value varchar(50))"; db.execSQL(sql); insertData(db, key, value); Cursor cursor = db.rawQuery("select * from tb_info", null); inflateListView(cursor); } } }); } // 向數據庫中插入數據 private void insertData(SQLiteDatabase db, String key, String value) { db.execSQL("insert into tb_info values (null,?,?)", new String[] { key, value }); System.out.println("------------------"); } // 向ListView中填充數據 @SuppressLint("NewApi") public void inflateListView(Cursor cursor) { SimpleCursorAdapter adapter = new SimpleCursorAdapter(Main.this, R.layout.mytextview, cursor, new String[] { "db_key", "db_value" }, new int[] { R.id.listkey, R.id.listvalue }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); lv.setAdapter(adapter); } @Override protected void onDestroy() { super.onDestroy(); if (db != null && db.isOpen()) { db.close(); } } }
實現的效果:
需要特別指出,在用SimpleCursorAdapter封裝Cursor的時候,要求底層數據庫表的主鍵列的列名為_id,因為SimpleCursorAdapter只能識別主鍵列名為_id的表。
進階
直接使用SQLiteDatabase的openOrCreateDatabase可以直接打開或者是新建一個SQLiteDatabase,但是這裡存在一個缺點。在每次執行SQL語句的時候都需要在try catch語句中進行,如果在try中直接操作的數據庫或者表不存在,就需要在catch中重新創建表並且執行CRUD操作,並且有關數據庫的每一個方法都要這麼做,重復的代碼太多了,所以實際的開發中大都選用SQLiteOpenHelper類。
主要方法:
使用方法:
1)繼承SQLiteOpenHelper。在構造方法中的參數String name就是數據庫的名稱。
2)重寫onCreate和onUpgrade方法。
MySQLiteOpenHelper類:
package com.app.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class MySQLiteOpenHelper extends SQLiteOpenHelper { String createSQL = "create table tb_test(_id integer primary key autoincrement ,name,age )"; public MySQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(createSQL); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { } }
Main.java
package com.app.main; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.Menu; import android.widget.Toast; import com.app.db.MySQLiteOpenHelper; public class Main extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "my.db3", null, 1); String insertSQL = "insert into tb_test values(null,'wx',18)"; SQLiteDatabase db = helper.getReadableDatabase(); db.execSQL(insertSQL); Cursor cursor = db.rawQuery("select * from tb_test", null); cursor.moveToFirst(); int id = cursor.getInt(0); Toast.makeText(this, id+"",Toast.LENGTH_SHORT).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
實現效果:
在Android之中呢,對於多線程的操作很是平凡,所以對於多線程的理解越深,那麼對於自己的程序便能夠很好的運行 這也是對於Android開發是一個重要的知識點,那麼我
頭部用的是TabLayout和ViewPager實現的 底部用的是FragmentTabHost和Fragment實現的先看底部的實現:底部布局: <fram
我們項目中經常會加載圖片,有時候如果加載圖片過多的話,小則導致程序很卡,重則OOM導致App掛了,今天翻譯https://developer.Android.com/tr
一、概述:在日常的app使用中,我們會在android 的app中看見 熱門標簽等自動換行的流式布局,今天,我們就來看看如何自定義一個類似熱門標簽那樣的流式布局吧(源碼下