2013-12-11 1 views
-2

Впервые я запустил приложение и ввел данные по createDefaultUser() в файл storage.db (версия базы данных 1).
Во второй раз я запускал приложение (Database Version 2), DatabaseManager.java функции onUpgrade() хорошо. Логкаты показали ОК.
Но onUpgrade() есть проблема, то есть SQLiteDatabase.exe(sql) ничего не вставлять, где sql не «null» и является строкой, считанной из файла.

Вот MainActivity.java:
Почему SQLiteDatabase.exec() ничего не вставляет?

package com.example.textbase; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     new AsyncDatabase().execute(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    private class AsyncDatabase extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      DatabaseManager db = new DatabaseManager(getApplicationContext()); 
      db.createDatabase(); 
      db.getWritableDatabase(); 
      //db.createDefaultUser(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      TextView txt=(TextView)findViewById(R.id.textView); 
      txt.setText("Done"); 
     } 

     @Override 
     protected void onPreExecute() { 
      TextView txt=(TextView)findViewById(R.id.textView); 
      txt.setText("Loading"); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 

     } 
    } 
} 


Вот DatabaseManager.java:

package com.example.textbase; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DatabaseManager extends SQLiteOpenHelper{ 

    private static final String DATABASE_PATH = "/data/data/com.example.textbase/databases/"; 
    private static final String DATABASE_NAME = "storage.db"; 
    private static final String CACHE_NAME="temp_favourite"; 
    private static final int DATABASE_VERSION =2; 
    private final Context context; 

    public DatabaseManager(Context context){ 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     this.context=context; 
    } 
    @Override 
    public void onCreate(SQLiteDatabase database) { 

    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     if(oldVersion<newVersion){ 
      Log.i("Database","New database is being upgraded."); 

      exportFavourite(db); 
      Log.i("Favourite","Favourite file has been exported."); 

      File f=new File(DATABASE_PATH+DATABASE_NAME); 
      f.delete(); 
      Log.i("Database","Old database has been deleted."); 

      copyDatabase(); 
      Log.i("Database","New database has been created."); 

      importFavourite(db); 
      Log.i("Favourite","Favourite file has been imported into database."); 

      f=new File(context.getFilesDir()+"/"+CACHE_NAME); 
      f.delete(); 
      Log.i("Favourite","Favourite file has been deleted."); 
     } 
    } 

    public void createDatabase(){ 
     boolean dbExist=checkDatabase(); 
     if(dbExist){ 
      Log.i("Database","Database exists."); 
     }else{ 
      copyDatabase(); 
     } 
    } 

    private void copyDatabase(){ 
     File databaseFile = new File(DATABASE_PATH); 
     // check if databases folder exists, if not create one and its subfolders 
     if (!databaseFile.exists()){ 
      databaseFile.mkdir(); 
      Log.i("Directory","Database directory has been created."); 
     } 
     String outFilename =null; 
     outFilename = DATABASE_PATH +DATABASE_NAME; 
     File sampleFile = new File(outFilename); 
     try { 
      InputStream in = context.getAssets().open(DATABASE_NAME); 
      OutputStream out = new FileOutputStream(outFilename); 
      byte[] buf = new byte[1024]; 
      int len; 
      while ((len = in.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
      out.flush(); 
      out.close(); 
      in.close(); 
      Log.i("Database","Database has been copied from asset folder."); 
      }catch(IOException e) { 
      } 
    } 

    private boolean checkDatabase() { 
     SQLiteDatabase checkDB = null; 
     try { 
      String fullPath = DATABASE_PATH + DATABASE_NAME; 
      checkDB = SQLiteDatabase.openDatabase(fullPath, null,SQLiteDatabase.OPEN_READONLY); 
     } catch (SQLiteException e) { 
      e.printStackTrace(); 
     } 

     if (checkDB != null) { 
      checkDB.close(); 

     } 
     return checkDB != null ? true : false; 
    } 

    private void setQuerytoFile(String str){ 
     FileOutputStream outputStream; 
     try { 
      outputStream = context.openFileOutput(CACHE_NAME, Context.MODE_APPEND); 
      outputStream.write(str.getBytes()); 
      outputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void exportFavourite(SQLiteDatabase db){ 
     String sql = "SELECT * FROM user"; 
     Cursor cursor = db.rawQuery(sql, null); 
     if (cursor.moveToFirst()) { 
      do { 
       String username=cursor.getString(1); 
       int password=Integer.parseInt(cursor.getString(2)); 
       String query="insert into user(username,password) values('"+username+"',"+password+");"; 
       setQuerytoFile(query); 
      } while (cursor.moveToNext()); 
     } 
    } 

    private String getQueryfromFile() throws IOException{ 
     BufferedReader in = null; 
     File file=new File(context.getFilesDir()+"/"+CACHE_NAME); 
     FileInputStream fin=new FileInputStream(file); 
     InputStream is=fin; 
     try 
     { 
      in = new BufferedReader(new InputStreamReader(is)); 
      String line; 
      final StringBuilder buffer = new StringBuilder(); 
      while ((line = in.readLine()) != null) 
      { 
       buffer.append(line); 
      } 
      return buffer.toString(); 
     } 
     catch (final IOException e) 
     { 
      return ""; 
     } 
     finally 
     { 
      try 
      { 
       in.close(); 
      } 
      catch (IOException e) 
      { 
       // ignore // 
      } 
     } 
    } 

    private void importFavourite(SQLiteDatabase db){ 
     File f=new File(context.getFilesDir()+"/"+CACHE_NAME); 
     if(f.exists()){ 
      String sql; 
      try { 
       sql = getQueryfromFile(); 
       Log.i("SQL Query",sql); 
       db.execSQL(sql); 
       Log.i("Database","Favourite backup has been imported.");    
       f.delete(); 
       Log.i("File","Favourite backup file has been deleted."); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     }else{ 
      Log.i("File","Favourite backup file does not exist."); 
     } 
    } 

    public void createDefaultUser(){ 
     String sql="insert into user(username,password) values('Administrator','123');"; 
     getWritableDatabase().execSQL(sql); 
     Log.i("User","Created default user"); 
    } 
} 


Вот Logcat при обновлении базы данных:

12-11 21:19:37.320: I/Database(4358): Database exists. 
12-11 21:19:37.590: I/Database(4358): New database is being upgraded. 
12-11 21:19:37.620: I/Favourite(4358): Favourite file has been exported. 
12-11 21:19:37.620: I/Database(4358): Old database has been deleted. 
12-11 21:19:37.630: I/Database(4358): Database has been copied from asset folder. 
12-11 21:19:37.630: I/Database(4358): New database has been created. 
12-11 21:19:37.650: I/SQL Query(4358): insert into user(username,password) values('Administrator',123);insert into user(username,password) values('Administrator',123);insert into user(username,password) values('Administrator',123); 
12-11 21:19:37.660: I/Database(4358): Favourite backup has been imported. 
12-11 21:19:37.660: I/File(4358): Favourite backup file has been deleted. 
12-11 21:19:37.660: I/Favourite(4358): Favourite file has been imported into database. 
12-11 21:19:37.660: I/Favourite(4358): Favourite file has been deleted. 


Вот база данных (storage.db) Таблица Схема:

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US'); 
CREATE TABLE [user] (
[user_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
[username] VARCHAR(255) NULL, 
[password] VARCHAR(255) NULL 
); 


Я хочу EXEC (SQL) успешно. Как я могу?
Почему SQLiteDatabase.exec() ничего не вставляет?

+3

, пожалуйста, прочитайте документацию для execSQL, прежде чем жаловаться на то, как она не работает так, как вам бы хотелось. – njzk2

ответ

0

Как вы можете прочитать в the official docs:

общественного недействительными ExecSQL (String SQL) Выполнить один оператор SQL, который не является SELECT, или любой другой оператор SQL, который возвращает данные.

Параметры

оператора SQL SQL заявление, которое будет выполняться. Несколько операторов , разделенных точками с запятой, не поддерживаются.

Важно, чтобы прочитать и понять ссылки перед использованием какой-либо функции.

+0

Это ответ, но не решение для достижения того, что я пытаюсь сделать. Я забирал sql.split (";") и вытащил базу данных и ничего не вставил. : '( –

+0

также я попробовал ContentValue для вставки данных. Ничего не вставил OO Bro, пожалуйста, проверьте выше код, и вы ничего не увидите. Я не знаю, почему. Должен ли я задать новый вопрос для вставки ничего? –

+0

Я предполагаю у вас недостаточно понимания функций. Вероятно, вы должны внимательно прочитать документы или несколько руководств для своего собственного блага, или вы получите сумасшедшие. В этом случае доказуемо лучше всего будет разбирать файл и вставлять его по строке –