原創作品,允許轉載,轉載時請務必聲明作者信息和本聲明。http://www.cnblogs.com/zhu520/p/8343675.html
本人小白,那個大神看到有問題可指出,謝謝。。。。
一:sqlite概念:是一個軟件庫,實現了自給自足(這意味着不需要任何外部的依賴),無服務器的,零配置的,事務性(完全兼容 ACID 的)的sql數據庫引擎,SQLite 是非常小的,是輕量級的,完全配置時小於 400KiB,省略可選功能配置時小於250KiB。支持多種開發語言,C, C++, PHP, Perl, Java, C#,Python, Ruby等
注意,SQLite 是不區分大小寫的,但也有一些命令是大小寫敏感的,比如 GLOB 和 glob 在 SQLite 的語句中有不同的含義。
對於Android,在應用程序中以編程方式創建的SQLite數據庫始終存儲在/data/data/項目名稱/databases
文件夾中
SQL 能做什么?
SQL 面向數據庫執行查詢
SQL 可從數據庫取回數據
SQL 可在數據庫中插入新的記錄
SQL 可更新數據庫中的數據
SQL 可從數據庫刪除記錄
SQL 可創建新數據庫
SQL 可在數據庫中創建新表
SQL 可在數據庫中創建存儲過程
SQL 可在數據庫中創建視圖
SQL 可以設置表、存儲過程和視圖的權限
二:創建一個Android 工程后繼承SQLiteOpenHelper它主要用於新建數據庫,新建數據表和跟新數據庫
package zhu.com.sqlite_curd; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by Pearl on 2018/1/25. */ public class CasualCreatClass extends SQLiteOpenHelper { /**構造方法 * (Context context, String name, CursorFactory factory,int version) * 數據庫創建的構造方法 數據庫名稱 sql_table.db ,版本號為1 * @param context 上下文對象 * @param /name 數據庫名稱 secb.db * @param /factory 游標工廠 * @param /version 數據庫版本 */ public CasualCreatClass(Context context) { super(context, "sql_table.db", null, 1); } /**數據庫第一次被使用時創建數據庫 * 初始化數據庫的表結構 */ @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { //執行有更新行為的sql語句 sqLiteDatabase.execSQL("CREATE Table man (manId integer primary key autoincrement, name varchar(20), age integer)"); } /**數據庫版本升級時調用 * 數據庫版本發生改變時才會被調用,數據庫在升級時才會被調用; * @param sqLiteDatabase 操作數據庫 * @param i 舊版本 * @param i1 新版本 */ @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { sqLiteDatabase.execSQL("drop table if exists man"); onCreate(sqLiteDatabase); } }
類中的構造方法用於創建數據庫和初始版本號;
onCreate方法用於初始化數據庫的表結構,這里新建了一個man表,里面有manId(主鍵),name,age;
onUpgrade方法用於數據庫版本升級時調用,此時可以用測試類去測試一下看看新建語法有沒有問題,看看有沒有新建數據庫:
在清單文件中application節點上方添加四行代碼(第三行要寫自己應用的包名)
三:源碼
1):activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context="zhu.com.sqlite_curd.MainActivity"> <!--市--> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:drawable/edit_text" android:addStatesFromChildren="true" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="?android:attr/textColorSecondary" android:text="城市名:" android:id="@+id/tvCity" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" android:background="@null" android:id="@+id/etCity" /> </LinearLayout> <!--編碼--> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:drawable/edit_text" android:addStatesFromChildren="true" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="?android:attr/textColorSecondary" android:text="市區號" android:id="@+id/tvCode" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" android:background="@null" android:id="@+id/etCode" /> </LinearLayout> <!--增加,修改,查詢--> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:addStatesFromChildren="true" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="增加" android:id="@+id/bt_add" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="修改" android:id="@+id/bt_modify" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查詢" android:id="@+id/bt_query" /> </LinearLayout> <!--把數據顯示到這里來--> <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="5dip" android:id="@+id/listView" /> </LinearLayout>
2):listview.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dip" android:id="@+id/linear" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:id="@+id/imCity" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="left" android:id="@+id/tvCity" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:gravity="right" android:id="@+id/btRemove" /> </RelativeLayout>
3):CityBean\
package zhu.com.sqlite_curd; /** * 普通JavaBean * */ public class CityBean { public static final String ID = "_id"; public static final String CITY = "city"; public static final String CODE = "code"; private String id; private String city; private String code; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
4):SQLiteHelper
package zhu.com.sqlite_curd; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; /** * 實現對表的創建、更新、變更列名操作 * @author ytm0220@163.com * */ public class SQLiteHelper extends SQLiteOpenHelper { public static final String TB_NAME = "citys"; public SQLiteHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * 創建新表 */ @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS " + TB_NAME + "(" + CityBean.ID + " integer primary key," + CityBean.CITY + " varchar," + CityBean.CODE + " integer"+ ")"); } /** * 當檢測與前一次創建數據庫版本不一樣時,先刪除表再創建新表 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TB_NAME); onCreate(db); } /** * 變更列名 * @param db * @param oldColumn * @param newColumn * @param typeColumn */ public void updateColumn(SQLiteDatabase db, String oldColumn, String newColumn, String typeColumn){ try{ db.execSQL("ALTER TABLE " + TB_NAME + " CHANGE " + oldColumn + " "+ newColumn + " " + typeColumn ); }catch(Exception e){ e.printStackTrace(); } } }
5):MainActivity
package zhu.com.sqlite_curd; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { private static String DB_NAME = "mycity.db"; private static int DB_VERSION = 1; private static int POSTION; private ListView listview; private Cursor cursor; private SQLiteDatabase db; private SQLiteHelper dbHelper; private ListAdapter listAdapter; private EditText etCity; private EditText etCode; private Button bt_add; private Button bt_modify; private Button bt_query; private List<CityBean> cityList = new ArrayList<CityBean>(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etCity = (EditText) findViewById(R.id.etCity); etCode = (EditText) findViewById(R.id.etCode); bt_add = (Button) findViewById(R.id.bt_add); bt_modify = (Button) findViewById(R.id.bt_modify); bt_query = (Button) findViewById(R.id.bt_query); try{ /* 初始化並創建數據庫 */ dbHelper = new SQLiteHelper(this, DB_NAME, null, DB_VERSION); /* 創建表 */ db = dbHelper.getWritableDatabase(); //調用SQLiteHelper.OnCreate() /* 查詢表,得到cursor對象 */ cursor = db.query(SQLiteHelper.TB_NAME, null, null, null, null, null, CityBean.CODE + " DESC"); cursor.moveToFirst(); while(!cursor.isAfterLast() && (cursor.getString(1) != null)){ CityBean city = new CityBean(); city.setId(cursor.getString(0)); city.setCity(cursor.getString(1)); city.setCode(cursor.getString(2)); cityList.add(city); cursor.moveToNext(); } }catch(IllegalArgumentException e){ //當用SimpleCursorAdapter裝載數據時,表ID列必須是_id,否則報錯column '_id' does not exist e.printStackTrace(); //當版本變更時會調用SQLiteHelper.onUpgrade()方法重建表 注:表以前數據將丟失 ++ DB_VERSION; dbHelper.onUpgrade(db, --DB_VERSION, DB_VERSION); // dbHelper.updateColumn(db, SQLiteHelper.ID, "_"+SQLiteHelper.ID, "integer"); } listview = (ListView)findViewById(R.id.listView); listAdapter = new ListAdapter(); listview.setAdapter(listAdapter); listview.setOnItemClickListener(new ListView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int postion, long arg3) { setSelectedValues(postion); } }); /* 插入表數據並ListView顯示更新 */ bt_add.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View arg0) { if(etCity.getText().length() > 1 && etCode.getText().length() >1){ ContentValues values = new ContentValues(); values.put(CityBean.CITY, etCity.getText().toString().trim()); values.put(CityBean.CODE, etCode.getText().toString().trim()); //插入數據 用ContentValues對象也即HashMap操作,並返回ID號 Long cityID = db.insert(SQLiteHelper.TB_NAME, CityBean.ID, values); CityBean city = new CityBean(); city.setId(""+cityID); city.setCity(etCity.getText().toString().trim()); city.setCode(etCode.getText().toString().trim()); cityList.add(city); listview.setAdapter(new ListAdapter()); resetForm(); } } }); /* 查詢表,模糊條件查詢 */ bt_query.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View view) { cityList.removeAll(cityList); String sql = null; String sqlCity = etCity.getText().length() > 0 ? CityBean.CITY + " like '%" + etCity.getText().toString().trim() + "%'" : ""; String sqlCode = etCode.getText().length() > 0 ? CityBean.CITY + " like '%" + etCity.getText().toString().trim() + "%'" : ""; if( (!"".equals(sqlCity)) && (!"".equals(sqlCode)) ){ sql = sqlCity + " and" + sqlCode; }else if(!"".equals(sqlCity)){ sql = sqlCity; }else if(!"".equals(sqlCode)){ sql = sqlCode; } cursor = db.query(true, SQLiteHelper.TB_NAME, new String[]{CityBean.ID, CityBean.CITY, CityBean.CODE}, sql, null, null, null, null, null); cursor.moveToFirst(); while(!cursor.isAfterLast() && (cursor.getString(1) != null)){ CityBean city = new CityBean(); city.setId(cursor.getString(0)); city.setCity(cursor.getString(1)); city.setCode(cursor.getString(2)); cityList.add(city); cursor.moveToNext(); } listview.setAdapter(new ListAdapter()); resetForm(); } }); /* 修改表數據 */ bt_modify.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View arg0) { ContentValues values = new ContentValues(); values.put(CityBean.CITY, etCity.getText().toString().trim()); values.put(CityBean.CODE, etCode.getText().toString().trim()); db.update(SQLiteHelper.TB_NAME, values, CityBean.ID + "=" + cityList.get(POSTION).getId(), null); cityList.get(POSTION).setCity(etCity.getText().toString().trim()); cityList.get(POSTION).setCode(etCode.getText().toString().trim()); listview.setAdapter(new ListAdapter()); resetForm(); } }); } /* 設置選中ListView的值 */ public void setSelectedValues(int postion){ POSTION = postion; etCity.setText(cityList.get(postion).getCity()); etCode.setText(cityList.get(postion).getCode()); } /* 重值form */ public void resetForm(){ etCity.setText(""); etCode.setText(""); } @Override protected void onDestroy() { db.delete(SQLiteHelper.TB_NAME, null, null); super.onDestroy(); } private class ListAdapter extends BaseAdapter { public ListAdapter(){ super(); } @Override public int getCount() { return cityList.size(); } @Override public Object getItem(int postion) { return postion; } @Override public long getItemId(int postion) { return postion; } @Override public View getView(final int postion, View view, ViewGroup parent) { view = getLayoutInflater().inflate(R.layout.listview, null); TextView tv = (TextView) view.findViewById(R.id.tvCity); tv.setText("" + cityList.get(postion).getCity()); TextView bu = (TextView) view.findViewById(R.id.btRemove); bu.setText("刪除");//R.string.delete bu.setId(Integer.parseInt(cityList.get(postion).getId())); /* 刪除表數據 */ bu.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View view) { try{ db.delete(SQLiteHelper.TB_NAME, CityBean.ID + "=" + view.getId(), null); cityList.remove(postion); listview.setAdapter(new ListAdapter()); }catch(Exception e){ e.printStackTrace(); } } }); return view; } } }
6):運行效果
7:源碼下載(放心這次是百度雲)密碼: ryv4