編輯:關於Android編程
File file = new File(“hah.txt”);
//只是創建了一個對象file, file指向了hah.txt這個文件,hah.txt這個文件可能存在,也可能不存在。如果文件不存在,則不會被創建。
必須要有文件輸出流對文件進行了寫的操作,文件才會被創建。
游標:在訪問數據庫中表結構時,想訪問表中的某一行的時候,數據庫內部有一個快速的定位方式,這個定位方式是通過索引來實現的。游標相當於數組的指針,通過游標的上下移動來查找數據。
創建數據庫
package com.test.sqllitedemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBOpenHelper extends SQLiteOpenHelper {
//子類構造函數的參數不一定要和父類構造函數的參數一一對應
public MyDBOpenHelper(Context context) {
/**
* @paramcontext 上下文
* @paramname 數據庫文件的名稱
* @paramfactory 用來創建游標對象,null就用默認的游標工廠
* @paramversion 數據庫的版本 號,從1開始。用來更新數據庫。
* 數據庫後綴名不是固定的,寫為.db只是為了方便查看和識別
*/
super(context, "test.db", null,1);
}
@Override
//數據庫第一次創建的時候自動執行
public void onCreate(SQLiteDatabase db) {
}
@Override
//數據庫版本更新時自動執行
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
創建數據庫
package com.test.sqllitedemo;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//執行該行代碼,數據庫不會被創建,只是創建了一個數據庫對象
MyDBOpenHelper helper = new MyDBOpenHelper(this);
//創建或者打開一個數據庫,該數據庫具有讀寫權限,位於data/data/應用程序包名/databases /文件夾下面
helper.getWritableDatabase();
}
}
在SQLite中創建表
SQLite中所有數據類型默認存儲都是字符串類型的,沒有長度限制的。超過表定義時的數據長度,也不會報錯。
在Android中SQLite會自動創建一張名為android_metadata的表。用於存儲當前的語言環境的。在SQLite中id推薦使用_id。
SQLite的數據庫版本只能增大,不能減小。
package com.test.sqllitedemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBOpenHelper extends SQLiteOpenHelper {
//子類構造函數的參數不一定要和父類構造函數的參數一一對應
public MyDBOpenHelper(Context context) {
/**
* @paramcontext 上下文
* @paramname 數據庫文件的名稱
* @paramfactory 用來創建游標對象,null就用默認的游標工廠
* @paramversion 數據庫的版本 號,從1開始。用來更新數據庫。
* 數據庫後綴名不是固定的,寫為.db只是為了方便查看和識別
*/
super(context, "test.db", null,1);
}
@Override
//數據庫第一次創建的時候自動執行,如果數據庫已經存在,則不會再次調用該方法
/**
* 該方法中創建表結構,初始化數據庫
* @param db 代表的是創建好的數據庫
*/
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//執行SQL語句
db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
}
@Override
//數據庫版本更新時自動執行,即數據庫版本號有變化的時候執行 數據庫的版本只能變大,不能變小
//int oldVersion, int newVersion用來完成跨版本升級數據庫時保持數據
//如果是壟斷性行業,數據是一次有效的情況下,可以強制以前數據失效的方式升級,讓用戶重新輸入數據
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("alter table info add money varchar(10)");
}
}
EL表達式只能在jsp頁面中使用。
數據庫的增刪改查。
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.test.databaseoper.MainActivity" >
android:onClick="add"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="add" />
android:onClick="update"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="update" />
android:onClick="delete"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="delete" />
android:onClick="query"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="query" />
package com.test.databaseoper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBOpenHelper extends SQLiteOpenHelper {
//子類構造函數的參數不一定要和父類構造函數的參數一一對應
public MyDBOpenHelper(Context context) {
/**
* @param context 上下文
* @param name 數據庫文件的名稱
* @param factory 用來創建游標對象,null就用默認的游標工廠
* @param version 數據庫的版本 號,從1開始。用來更新數據庫。
* 數據庫後綴名不是固定的,寫為.db只是為了方便查看和識別
*/
super(context, "test.db", null,1);
}
@Override
//數據庫第一次創建的時候自動執行,如果數據庫已經存在,則不會再次調用該方法
/**
* 該方法中創建表結構,初始化數據庫
* @param db 代表的是創建好的數據庫
*/
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//執行SQL語句
db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varch ar(20))");
}
@Override
//數據庫版本更新時自動執行,即數據庫版本號有變化的時候執行 數據庫的版本只能變大,不能變小
//int oldVersion, int newVersion用來完成跨版本升級數據庫時保持數據
//如果是壟斷性行業,數據是一次有效的情況下,可以強制以前數據失效的方式升級,讓用戶重新輸入數據
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("alter table info add money varchar(10)");
}
}
package com.test.databaseoper;
import java.util.Random;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void add(View view){
//創建數據庫
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
Random random = new Random();
String sql = "insert into info(name,phone)values(?,?)";
//在SQLite中,也可以使用占位符來傳遞參數
db.execSQL(sql, new Object[]{"lisi"+random.nextInt(100),"453231"});
//釋放資源
db.close();
}
public void delete(View view){
}
public void update(View view){
}
public void query(View view){
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
String sql = "select * from info";
Cursor cursor = db.rawQuery(sql, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println(id+" "+name+" "+phone);
}
//釋放資源
cursor.close();
db.close();
}
}
在SQLite中,所有的數據都是當做字符串存的。
Android數據庫中支持中文顯示
查看SQLite中表中的數據的三種方式
1.寫sql語句把數據查出,顯示在logcat中查看
2.在應用程序獨立數據區,把數據庫pull出來,然後再可是話工具中查看
3.在命令行查看SQLite數據庫中表中的數據
更改命令行默認的編碼集
chcp(change current page) 65001(utf-8的編碼值)
插入重復數據時,應該提示用戶是否覆蓋已有的數據。
刪除數據時,應該提示用戶是否確定刪除。
程序的設計應該有良好的提示和操作方式。
查詢操作不會更改數據庫中的內容。一般獲取可讀的數據庫。
多線程寫數據庫,必須明確寫入的先後順序。以及加鎖。
讀的操作可以多線程並發操作,寫數據庫的操作必須枷鎖。
googleAndroidapi對數據庫的增刪改查
package com.test.databaseoper;
import java.util.Random;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class GoogleDataBaseOPR extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void add(View view) {
// 創建數據庫
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
Random random = new Random();
ContentValues values = new ContentValues();
values.put("name", "lisi" + random.nextInt(100));
values.put("phone", "12345678");
/*
* db.insert(table, nullColumnHack, values)
* 第一個參數:表名
* 第二個參數:要填充空值的列
* 第三個參數:插入的值 map集合,ContentValues
*/
long id = db.insert("info", null, values);
if (id != -1) {
Toast.makeText(this, "添加成功,添加在" + id + "行", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "添加失敗", Toast.LENGTH_SHORT).show();
}
// 釋放資源
db.close();
}
public void delete(View view) {
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
/*
* db.delete(table, whereClause, whereArgs)
* 第一個參數:表名
* 第二個參數:選擇條件
* 第三個參數:選擇條件的參數
* 返回值:刪除的行數,如果沒有刪除,返回0;
*/
int result = db.delete("info", null, null);
db.close();
if (result != 0) {
Toast.makeText(this, "刪除"+ result + "行", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "刪除失敗" , Toast.LENGTH_SHORT).show();
}
}
public void update(View view) {
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
/*
* db.update(table, values, whereClause, whereArgs)
* 第一個參數:表名
* 第二個參數:插入的值
* 第三個參數:選擇條件,沒有選擇條件時填null
* 第四個參數:選擇條件的參數 沒有參數時填null
* 返回值:修改的行數,如果沒有修改,返回0;
*/
ContentValues values = new ContentValues();
values.put("name", "lisi");
values.put("phone", "12345678");
int result = db.update("info", values, null, null);
if (result != 0) {
Toast.makeText(this, "修改了第"+ result + "行", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "修改失敗" , Toast.LENGTH_SHORT).show();
}
}
public void query(View view) {
MyDBOpenHelper helper = new MyDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
/*
* db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
* 第一個參數:表名
* 第二個參數:返回的列 null表示返回所有列
* 第三個參數:選擇條件,沒有選擇條件寫null
* 第四個參數:選擇條件的參數,沒有選擇條件參數寫null
* 第五個參數:分組條件,沒有寫null
* 第六個參數:分組條件,沒有寫null
* 第七個參數:分組條件,沒有寫null
* 返回值:查詢結果的記錄的條數
*/
//Cursor cursor = db.query("info", null, null, null,null,null,null);
Cursorcursor=db.query("info",newString[]{"_id","name","phone"},null,null,null,null,null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println(id+" "+name+" "+phone);
}
//釋放資源
cursor.close();
db.close();
db.close();
}
}
上一篇博客講的是獲取聯系人信息,這篇是獲取通話記錄 package cn.zxw.contact.domain;/** * 通話記錄 * @auth
android開發中,對於復用率較高的多個控件,采用組件的方式可能更加方便,首先定義一個xml文件: 文件名:lyt_customer_service_phone.xml
Android 5.0 Lollipop 是迄今為止最重大的一次發布,因為 material design 的存在,android的界面風格發生了新的改變,這是一門新的設
在上一篇文章裡,我總結了一下自定義控件需要了解的基礎知識:View的繪制流程——《自定義控件知識儲備-View的繪制流程》。其中,在View的測量