編輯:關於android開發
當我們軟件中要使用大量數據,我們會選擇將這些數據存儲到一個數據庫中,然後通過數據庫的查詢修改操作來管理這些數據。大多數情況下我們都只在程序中建立使用數據庫,但也有我們在程序中只是使用的數據庫,並不在程序中建立它們,因為這種數據庫往往數據量比較大,我們在建立時如果不采用多線程和後台服務的話,很容易導致前台界面的阻塞停滯,這樣往往會影響用戶體驗,造成不好的使用效果。這時我們可不可以直接建好數據庫並錄入數據,然後通過程序將數據庫正確導入進我們的軟件文件夾裡面。這樣減少了讀取數據和建立數據庫的時間,可以在很大程度上提高軟件響應的速度。
還是結合之前做的一個軟件的天氣預報功能開發的實例來講解如何導入外部數據庫。首先我們通過DDMS看一下數據庫的存放路徑,一般情況下數據庫的存放路徑為:/data/packagname/databases/( packagname指的是我們所建立的工程的包名,例如這裡我的包名就是com.liuproject.reminder。有的數據庫就直接在packagname下面,有的則是在databases目錄下,大家可以打開DDMS看一下。)如圖databases文件夾下面有兩個數據庫:
其中City(上圖為導入成功後的截圖)就是我們即將要從外部導入的數據庫。我們將建好的City數據庫文件拷貝到我們所建工程的assets文件夾中,如下圖所示:

要注意我們所提供的外部數據要和我們設計的將在軟件中使用的數據庫保持一致,及時每一條記錄的屬性值名稱和數據類型一致。數據准備完成後我們就可以開始導入外部數據庫了。具體實現源碼如下:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
public class ImportDB{
private final int BUFFER_SIZE = 10000;
public static final String DB_NAME = "City"; //保存的數據庫文件名
public static final String PACKAGE_NAME = "com.liuproject.reminder";//工程包名
public static final String DB_PATH = "/data"
+ Environment.getDataDirectory().getAbsolutePath() + "/"
+ PACKAGE_NAME+"/databases"; //在手機裡存放數據庫的位置
private Context context;
ImportDB(Context context) {
this.context = context;
}
public void copyDatabase() {
String dbfile=DB_PATH + "/" + DB_NAME ;
try {
//執行數據庫導入
InputStream is = this.context.getResources().getAssets().open("City"); //欲導入的數據庫
FileOutputStream fos = new FileOutputStream(dbfile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();//關閉輸出流
is.close();//關閉輸入流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
通過上面的這個class我們就可以將存放在assets文件夾中的外部數據庫導入到我們所需要的文件目錄下。接著開始建立我們在程序中所要使用的數據庫類,如下代碼:
class CityDB extends SQLiteOpenHelper{//城市Id數據庫操作
private final String DB_NAME="CityID";//數據庫名稱
public CityDB(Context context,String name,CursorFactory factory,int version) {
super(context, name,factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createDB= "create table "+DB_NAME+"(cityid varchar(14) primary key , cityname varchar(20),type int)";//數據庫中記錄的屬性名稱及屬性值類型
db.execSQL(createDB);//創建數據庫
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String dropTableSQL = "DROP TABLE IF EXISTS " + DB_NAME + " ";
db.execSQL(dropTableSQL);
dropTableSQL = "DROP TABLE IF EXISTS " + DB_NAME + " ";
db.execSQL(dropTableSQL);
onCreate(db);
}
public void execSQL(String sql, Object[] args) {//執行操作
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL(sql, args);
}
public Cursor query(String sql, String[] args) {//返回操作結果指針
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(sql, args);
return cursor;
}
}
在之後的程序中我們就可以通過new CityDB(this, NAME, null,
使用新版Android Studio檢測內存洩露和性能
使用新版Android Studio檢測內存洩露和性能 內存洩露,是Android開發者最頭疼的事。可能一處小小的內存洩露,都可能是毀於千裡之堤的蟻穴。 怎麼才能檢測內
用Android studio進行 OpenCV 開發的第一個項目,androidopencv
用Android studio進行 OpenCV 開發的第一個項目,androidopencv我的天! 折騰了好久終於搭建成功了第一個項目。 項目環境: Windows
Android 學習之路,android學習之路
Android 學習之路,android學習之路Android 學習之路 轉載:http://stormzhang.com/android/2014/07/07/lea
[android] 手機衛士保存密碼時進行md5加密,androidmd5
[android] 手機衛士保存密碼時進行md5加密,androidmd5一般的手機沒有root權限,進不去data/data目錄,當手機刷機了後,擁有root權限,就可