編輯:關於Android編程
SQLite是一個輕量型的數據庫。
用之前,先了解SQL基礎知識
SQLite的數據類型
null:空值相當於java中的null integer:帶符號的整型,相當於java中的int real:浮點數字,相當於java中的float/double text/varchar:字符串文本,相當於java中的String blob:二進制對象,相當於java中的byte數組,用於存放圖片提醒:sql中不區分大小寫
Sqlite3中的約束
約束就是限定數據庫字段的條件
NOT NULL :非空
UNIQUE:唯一
PRIMARY:主鍵
CHECK:條件檢查
DEFAULT:默認
可對表裡的結構和字段進行約束限定,將約束條件放在需要約束的字段之後
創建表
數據庫是數據庫,數據表是存放在數據庫中存放信息的容器,
create table 表名(字段名 類型 長度 約束條件,….)
其中,長度和約束條件可根據實際情況添加
eg:create table student( "+"id INTEGER PRIMARY KEY AUTOINCREMENT," +"name VARCHAR(20) NOT NULL," +"cid INTEGER," +"age INTEGER CHECK(age>18 and age<60)," +"gender BIT DEFAULT(1)," +"score REAL");
重要事項
SQL 對大小寫不敏感 SQL 語句後面的分號,分號是在數據庫系統中分隔每條 SQL 語句的標准方法,這樣就可以在對服務器的相同請求中執行一條以上的語句。 星號(*)是選取所有列的快捷方式。 引號的使用。SQL 使用單引號來環繞文本值(大部分數據庫系統也接受雙引號)。如果是數值,請不要使用引號。SQL DML 和 DDL
可以把 SQL 分為兩個部分:數據操作語言 (DML) 和 數據定義語言 (DDL)。
SQL (結構化查詢語言)是用於執行查詢的語法。但是 SQL 語言也包含用於更新、插入和刪除記錄的語法。
查詢和更新指令構成了 SQL 的 DML 部分:
SQL 的數據定義語言 (DDL) 部分使我們有能力創建或刪除表格。我們也可以定義索引(鍵),規定表之間的鏈接,以及施加表間的約束。
SQL 中最重要的 DDL 語句:
CREATE DATABASE - 創建新數據庫 ALTER DATABASE - 修改數據庫 CREATE TABLE - 創建新表 ALTER TABLE - 變更(改變)數據庫表 DROP TABLE - 刪除表 CREATE INDEX - 創建索引(搜索鍵) DROP INDEX - 刪除索引sql語句
語法:
SELECT 列名稱 FROM 表名稱
eg:SELECT LastName FROM Persons
表示從Persons表裡面獲取名為LastName的列
SELECT DISTINCT 語句
DISTINCT:取唯一不同的值
語法:
SELECT DISTINCT 列名稱 FROM 表名稱
eg:SELECT DISTINCT Company FROM Orders
表示從Orders表中選取唯一的Company
WHERE 子句
WHERE 子句用於規定選擇的標准。如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句。
語法
select 列 from 表名稱 where 列 運算符 值
eg:SELECT *FROM PERSONS WHERE City='beijing'
表示從PERSONS表中選取居住在北京的人
AND & OR 運算符
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。
如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。
如果第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。
AND
eg:SELECT*FROM Persons WHERE FirstName='Thomas'**AND** Lastname='Carter'
OR
eg:SELECT * FROM Persons WHERE firstName='Thomas'**OR** lastName='Carter'
結合 AND 和 OR 運算符
使用圓括號來組成復雜的表達式
eg:SELECT * FROM Persons WHERE (FirstName='Thomas' OR
FirstName='William')
AND LastName='Carter'
ORDER BY 子句
ORDER BY 語句用於對結果集進行排序。
ORDER BY 語句用於根據指定的列對結果集進行排序 ORDER BY 語句默認按升序對記錄進行排序 如果想按降序,可以使用DESC,升序使用ASC,但幾乎沒什麼用,因為默認升序
eg1:SELECT Company,OrderNumber From Order ORDER BY Company
表示從Orders表中選取Company和OrderNumber,以Company排序
eg2:SELECT Company,OrderNumber FORM Orders ORDER BY Company,OrderNumber
表示從Orders中選取Company,OrderNumber,以字母順序顯示公司名稱(Company),並以數字順序顯示順序號(OrderNumber)
eg3:SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
表示從Orders中選取Company,OrderNumber,以逆字母順序顯示公司名稱
eg4:SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
表示從Orders中選取Company,OrderNumber,以逆字母順序顯示公司名稱,並以數字順序顯示順序號
INSERT INTO 語句
INSERT INTO 語句用於向表格中插入新的行。
語法:
INSERT INTO 表名稱 VALUES (值1, 值2,....)
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
插入新的行
eg:INSERT INTO Persons VALUES('gates','Bill','xuanwumen','beijing');
在指定的列中插入數據
eg:INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
Update 語句
Update 語句用於修改表中的數據。
語法
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值新某一行中的一個列
eg:UPDATE Person SET FirstName='Fred' WHERE LastName='Wilson'
表示更新Person表中LastName列中為Wilson的FirstName為Fred,
更新某一行中的若干列
eg:UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'
表示更新Person表中LastName列中為Wilson的Address和City
DELETE 語句
DELETE 語句用於刪除表中的行。
語法:
DELETE FROM 表名 WHERE 列名=值
eg:DELETE FROM Person WHERE LastName = 'Wilson'
表示刪除LastName為Wilson的人
刪除所有行
可以在不刪除表的情況下刪除所有的行。這意味著表的結構、屬性和索引都是完整的:
DELETE FROM table_name
或者
DELETE * FROM table_name**
Android中使用SQL
1、編寫數據庫幫助類
操作步驟:
新建數據庫幫助類,繼承自SQLiteOpenHelper 編寫構造方法 重寫onCreate和onUpdate方法
具體代碼
package com.cd.databasedemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by Sky on 2016/10/7.
* sQL幫助類,必須繼承自SQLiteOpenHelper,並重寫兩個方法
* onCreate和onUpgrade,
* onCreate:數據可創建時調用,主要用來初始化數據表結構,和初始數據
* onUpgrade:數據庫更新時調用,主要用來改變表結構
*
*
* 數據庫幫助類要做的事: *
* 重寫onCreate和onUpgrade * 在這兩個方法中填寫sql語句 */ public class MydbHelper extends SQLiteOpenHelper { /** * @param context 上下文 * name 數據庫名稱 * CursorFactory 游標工廠,填寫null表示使用默認游標 * version 版本號,只能增不能減,否則會報錯 */ public MydbHelper(Context context) { super(context, "Sky.db", null, 2); } /** * 在數據庫創建時調用,主要用來初始化數據表結構和初始化數據記錄 * * @param db 當數據庫第一次被創建時調用這個方法,適合在這個方法裡面把數據表結構定義出來 * 所以只有第一次運行的時候才會執行這個方法,如果要看到這個方法執行,需要重新安裝app */ @Override public void onCreate(SQLiteDatabase db) { Log.d("MydbHelper", "創建數據庫onCreate"); db.execSQL("create table contactinfo(" +" id INTEGER PRIMARY KEY AUTOINCREMENT ," +" name varchar not null , " +" phone varchar not null )"); // db.execSQL("create table contactinfo(" // +"id integer primary key autoincrement," // +"name varchar(20)," // +"phone varchar(20))"); } /** * 當數據庫版本更新的時候調用,版本號必須比之前的大,否則會報錯 * * @param db * @param oldVersion * @param newVersion */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table contactinfo add account varchar(20)"); } }
數據庫操作類
步驟:
編寫構造方法,實例化數據庫幫助類 通過調用數據庫幫助類,編寫
package com.cd.databasedemo;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
* Created by Sky on 2016/10/7.
*/
public class ContactinfoDao {
MydbHelper mMydbHelper;
/**
* 在構造方法中實例化幫助類
*
* @param context
*/
public ContactinfoDao(Context context) {
mMydbHelper = new MydbHelper(context);
}
/**
* 將數據庫打開,幫幫助類實例化,然後利用這個對象
*/
public long addData(String name, String phone) {
/**
* getWritableDatabase:
* Create and/or open a database that will be used for reading and writing.
*
*
* 增刪改查,每一次操作都要得到數據庫,操作完成後都要記得關閉
* getWritableDatabase得到後數據庫才會被創建
* 數據庫文件利用DDMS可以查看,在 data/data/包名/databases 目錄下即可查看
*/
SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
/**
* ContentValues:This class is used to store a set of values
* 存儲值得集合
*/
ContentValues values = new ContentValues();
values.put("name", name);
values.put("phone", phone);
/**
* 參數1:表名
* 參數2:可選擇的項。可空、
* 參數3:要添加的值
* 返回類型:添加數據所在行數,如果返回-1,則表示添加失敗
*/
long row = writableDatabase.insert("contactinfo", null, values);
return row;
}
/**
* 刪除
*
* @param name
* @return
*/
public int deleteData(String name,String phone) {
SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
/**
*參數1:表名
* 參數2:刪除條件,如果為null,則表示刪除全部
* 參數3:
*/
int result = writableDatabase.delete("contactinfo", "name=(?,?)", new String[]{name,phone});
return result;
}
/**
*查詢
* @param name
* @return
*/
public String alertData(String name) {
SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
/**
* 參數1:查詢的表
* 參數2:查詢的列
* 參數3:selection
* 參數4:selectionArgs
* 參數5:groupBy
* 參數6:having
* 參數7:orderBy
*/
Cursor cursor = writableDatabase.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
String phone = null;
if (cursor.moveToNext()) {
phone = cursor.getString(0);
}
//關閉cursor
cursor.close();
//關閉數據庫
writableDatabase.close();
return phone;
}
/**
* 更新
* @param name
* @param newphone
* @return
*/
public int updateData(String name, String newphone) {
SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("phone", newphone);
//更新contactinfo表中,name=name的手機號,返回行號
int row = writableDatabase.update("contactinfo", values, "name=?", new String[]{name});
return row;
}
}
Activity裡面使用
先看小毛驢(xml)
activity代碼<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvcD4NCjxwcmUgY2xhc3M9"brush:java;">
package com.cd.databasedemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button mInsert,mDelete,mUpdata,mAlert;
EditText mName,mPhone;
ContactinfoDao mContactinfoDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mInsert= (Button) findViewById(R.id.btn_insert);
mDelete= (Button) findViewById(R.id.btn_delete);
mUpdata= (Button) findViewById(R.id.btn_update);
mAlert= (Button) findViewById(R.id.btn_alert);
mName= (EditText) findViewById(R.id.et_name);
mPhone= (EditText) findViewById(R.id.et_phone);
mInsert.setOnClickListener(this);
mDelete.setOnClickListener(this);
mUpdata.setOnClickListener(this);
mAlert.setOnClickListener(this);
mContactinfoDao=new ContactinfoDao(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_insert:
String name = mName.getText().toString();
String phone = mPhone.getText().toString();
if (TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
Toast.makeText(this, "請輸入姓名和手機號", Toast.LENGTH_SHORT).show();
return;
}else {
long row = mContactinfoDao.addData(name, phone);
if (row==-1){
Toast.makeText(this, "添加失敗", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "成功添加在"+row+"行", Toast.LENGTH_SHORT).show();
}
}
break;
case R.id.btn_delete:
String name1 = mName.getText().toString();
String phone1 = mPhone.getText().toString();
if (TextUtils.isEmpty(name1)){
Toast.makeText(this, "請輸入刪除條件", Toast.LENGTH_SHORT).show();
return;
}else {
int row_del = mContactinfoDao.deleteData(name1,phone1);
if (row_del==-1){
Toast.makeText(this, "刪除失敗", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "成功刪除第" + row_del + "行", Toast.LENGTH_SHORT).show();
}
}
break;
case R.id.btn_update:
String name_up = mName.getText().toString();
String phone_up = mPhone.getText().toString();
if (TextUtils.isEmpty(name_up)||TextUtils.isEmpty(phone_up)){
Toast.makeText(this, "請輸入更新條件", Toast.LENGTH_SHORT).show();
return;
}else {
int row_up = mContactinfoDao.updateData(name_up, phone_up);
if (row_up==-1){
Toast.makeText(this, "更新失敗", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "成功更新第" + row_up + "條", Toast.LENGTH_SHORT).show();
}
}
break;
case R.id.btn_alert:
String name_alert = mName.getText().toString();
if (TextUtils.isEmpty(name_alert)){
Toast.makeText(this, "請添加查詢條件", Toast.LENGTH_SHORT).show();
return;
}else {
String phone_alert = mContactinfoDao.alertData(name_alert);
Toast.makeText(this, "查詢到的手機號為" + phone_alert, Toast.LENGTH_SHORT).show();
mPhone.setText(phone_alert);
}
break;
}
}
}
全部代碼如上。
數據庫文件保存在系統文件夾的/data/data/包名/databases路徑下,操作時可以將文件導出,使用sqlite developer打開查看。
getReadableDatabase()和getWritableDatabase()的比較
這兩個方法都可以創建或打開一個現有的數據庫(如果數據庫已存在則直接打開,否則創建一個新的數據庫),並返回一個可對數據庫進行讀寫操作的對象 當數據庫不可寫入的時候(如磁盤空間已滿)getReadableDatabase()方法返回的對象將以只讀的方式去打開數據庫,而getWritableDatabase()方法則將出現異常
上一篇文章中給大家分析了一下android系統啟動之後調用PackageManagerService服務並解析系統特定目錄,解析apk文件並安裝的過程,這個安裝過期實際上
打開項目以後,點擊項目,選擇 Build 菜單, 然後選擇 Generate Signed APK. 如下圖所示:打開生成對話框:選擇 Create new... 按鈕,
最近做項目真是頭疼呢?之前想用ListViewAnnotation來著,就是可以實現類似於android 通知欄滑動刪除的效果。好像是一位大牛自己一個人寫的
anddroid studio的內存修改昨天有位朋友問到了下面的一個問題這個判斷為android studio的分配的內存不夠用。據我的了解造成這個的原因主要有以下幾個方