sql文件一般不应该由Android直接执行的,正常应该是先转成db文件直接放入Android中,Android只需执行一些简单sql命令。
但有时有这样的需求怎么办呢,比如你数据库是上个版本放进的,这个版本的更新就是一个sql文件,你重新放一个数据库那用户数据都没了。
这个还是很简单的,从assets读取到sql文件,转成String,获取writeableDatabase,然后执行sql就行了。
- public class MainActivity extends Activity {
-
-
-
-
-
-
-
-
- private String readTextFromSDcard(InputStream is) throws Exception {
- InputStreamReader reader = new InputStreamReader(is);
- BufferedReader bufferedReader = new BufferedReader(reader);
- StringBuffer buffer = new StringBuffer("");
- String str;
- while ((str = bufferedReader.readLine()) != null) {
- buffer.append(str);
- buffer.append("\n");
- }
- return buffer.toString();
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- SQLiteDatabase db = new DatabaseHelper(this, "my.db")
- .getWritableDatabase();
-
- try {
-
- InputStream in = getAssets().open("garden.sql");
-
- String sqlUpdate = null;
- try {
- sqlUpdate = readTextFromSDcard(in);
- } catch (Exception e) {
- e.printStackTrace();
- }
- String[] s = sqlUpdate.split(";");
- for (int i = 0; i < s.length; i++) {
- if (!TextUtils.isEmpty(s[i])) {
- db.execSQL(s[i]);
- }
- }
- in.close();
- } catch (SQLException e) {
- } catch (IOException e) {
- }
-
- }
-
- }
只有一个要注意的地方,执行sql时只会执行到分号的位置,所以要按分号分割,执行多次。执行完后在/data/data/packageName下面就可以看到db文件了。