Android 根据sql文件创建数据库并插入数据
因为在开发客户端的时候,服务器端的有写数据是重复的,不需要再去访问服务器的,然后服务器端提供的是一个sql文件,里面包含了数据库和数据,我们这些开发客户端的不可能一行一行的进行手动入库吧?所以我就想到了直接读取sql文件进行创建数据并插入数据好了。
创建DBHelp并继承SQLiteOpenHelper
public class DBHelper extends SQLiteOpenHelper { private Context mContext; public DBHelper(Context context, String databaseName, CursorFactory factory, int version) { super(context, databaseName, factory, version); mContext = context; } /** * 数据库第一次创建时调用 * */ @Override public void onCreate(SQLiteDatabase db) { if (!tabIsExist("test", db)) { executeAssetsSQL(db, "test.sql"); // db.execSQL(sql); //System.out.println("创建表"); } } /** * 数据库升级时调用 * */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库不升级 if (newVersion <= oldVersion) { return; } Configuration.oldVersion = oldVersion; int changeCnt = newVersion - oldVersion; for (int i = 0; i < changeCnt; i++) { // 依次执行updatei_i+1文件 由1更新到2 [1-2],2更新到3 [2-3] String schemaName = "update" + (oldVersion + i) + "_" + (oldVersion + i + 1) + ".sql"; executeAssetsSQL(db, schemaName); } } /** * 读取数据库文件(.sql),并执行sql语句 * */ private void executeAssetsSQL(SQLiteDatabase db, String schemaName) { BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader(mContext.getAssets() .open(Configuration.DB_PATH + "/" + schemaName))); //System.out.println("路径:" + Configuration.DB_PATH + "/" + schemaName); String line; String buffer = ""; while ((line = in.readLine()) != null) { buffer += line; if (line.trim().endsWith(";")) { db.execSQL(buffer.replace(";", "")); buffer = ""; } } } catch (IOException e) { Log.e("db-error", e.toString()); } finally { try { if (in != null) in.close(); } catch (IOException e) { Log.e("db-error", e.toString()); } } } public List<Area> selectAllCities(SQLiteDatabase db) { List<Area> areas = new ArrayList<Area>(); Area area; String sql = "select * from test where area_level=?"; Cursor cursor = db.rawQuery(sql, new String[] { "" + 0 }); while(cursor.moveToNext()){ area = new Area(); area.setId(cursor.getInt(0)); area.setArea_name(cursor.getString(2)); areas.add(area); area = null; } cursor.close(); return areas; } public List<Area> selectAllAreas(SQLiteDatabase db,int parent_id) { List<Area> areas = new ArrayList<Area>(); Area area; String sql = "select * from test where parent_id=?"; Cursor cursor = db.rawQuery(sql, new String[] { "" + parent_id }); while(cursor.moveToNext()){ area = new Area(); area.setId(cursor.getInt(0)); area.setArea_name(cursor.getString(2)); areas.add(area); area = null; } cursor.close(); return areas; } /** * 判断是否存在某一张表 * @param tabName * @param db * @return */ public boolean tabIsExist(String tabName, SQLiteDatabase db) { boolean result = false; if (tabName == null) { return false; } Cursor cursor = null; try { String sql = "select count(*) as c from sqlite_master where type ='table' and name ='" + tabName.trim() + "' "; cursor = db.rawQuery(sql, null); if (cursor.moveToNext()) { int count = cursor.getInt(0); if (count > 0) { result = true; } } } catch (Exception e) { } return result; } }
Configuration.java是一些常量
public class Configuration { public static final String DB_PATH = "schema"; public static final String DB_NAME = "test.db"; public static final int DB_VERSION = 1; public static int oldVersion = -1; }sql文件是放在assets->schema->test.sql
其实这个过程非常的简单易懂,就是根据路径去读取文件,然后读取文件里面的内容,再根据关键字,sqllite会自动进行相应的操作,所以这个sql文件中的sql语句一定要规范,不然会写入不了的。
在activity中调用:
dbHelper = new DBHelper(this, "test", null, 1); dbHelper.onCreate(dbHelper.getWritableDatabase());
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。