Android: Доступ к базе данных sqlite в папке ресурсов с расширением .sqlite - PullRequest
37 голосов
/ 09 апреля 2010

Как прочитать данные из файла базы данных sqlite папки активов с расширением .sqlite в моем приложении Android?

Ответы [ 7 ]

33 голосов
/ 10 мая 2011

Попробуйте этот код:

public class DataBaseHelper extends SQLiteOpenHelper {
    private Context mycontext;

    //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/";
    private static String DB_NAME = "(datbasename).sqlite";//the extension may be .sqlite or .db
    public SQLiteDatabase myDataBase;
    /*private String DB_PATH = "/data/data/"
                        + mycontext.getApplicationContext().getPackageName()
                        + "/databases/";*/

    public DataBaseHelper(Context context) throws IOException {
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
            //System.out.println("Database exists");
            opendatabase(); 
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }

    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if(dbexist) {
            //System.out.println(" Database exists.");
        } else {
            this.getReadableDatabase();
            try {
                copydatabase();
            } catch(IOException e) {
                throw new Error("Error copying database");
            }
        }
    }   

    private boolean checkdatabase() {
        //SQLiteDatabase checkdb = null;
        boolean checkdb = false;
        try {
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
            checkdb = dbfile.exists();
        } catch(SQLiteException e) {
            System.out.println("Database doesn't exist");
        }
        return checkdb;
    }

    private void copydatabase() throws IOException {
        //Open your local db as the input stream
        InputStream myinput = mycontext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outfilename = DB_PATH + DB_NAME;

        //Open the empty db as the output stream
        OutputStream myoutput = new FileOutputStream("/data/data/(packagename)/databases   /(datbasename).sqlite");

        // transfer byte to inputfile to outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myinput.read(buffer))>0) {
            myoutput.write(buffer,0,length);
        }

        //Close the streams
        myoutput.flush();
        myoutput.close();
        myinput.close();
    }

    public void opendatabase() throws SQLException {
        //Open the database
        String mypath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
    }

    public synchronized void close() {
        if(myDataBase != null) {
            myDataBase.close();
        }
        super.close();
    }

}
7 голосов
/ 07 июля 2012

Поместите старую базу данных (old.db) в вашу папку активов. Введите это внутри onCreate () вашей деятельности:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
....

//=======Code For copying Existing Database file to system folder for use====//
    // Copying Existing Database into system folder
        try {

            String destPath = "/data/data/" + getPackageName()
                    + "/databases/data.db";

            File f = new File(destPath);
            if(!f.exists()){
            Log.v(TAG,"File Not Exist");
            InputStream in = getAssets().open("old.db");
            OutputStream out = new FileOutputStream(destPath);

            byte[] buffer = new byte[1024];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
            in.close();
            out.close();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            Log.v("TAG","ioexeption");
            e.printStackTrace();
        }

        DBManager dbManager =  new DBManager(this);
        Log.v(TAG,"Database is there with version: "+dbManager.getReadableDatabase().getVersion());
        String sql = "select * from prizes";


        SQLiteDatabase db = dbManager.getReadableDatabase();
        Cursor cursor = db.rawQuery(sql, null);
        Log.v(TAG,"Query Result:"+cursor);


        cursor.close();
        db.close();
        dbManager.close();

....

} 

Теперь вам нужно создать класс DBManager, который подклассов SQLiteOpenHelper. Вставьте абстрактный метод и конструктор. Не забудьте ввести правильное имя базы данных в super () dbHelper.

public class DBManager extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String TAG = "DATABASES";

public DBManager(Context context) {
    super(context, "data.db", null, DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase db) {
    Log.v(TAG,"On create Called:"+db.getPath());
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

Теперь вы можете получить доступ к базе данных, создав экземпляр DBManager.

SQLiteDatabase db = dbManager.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, null);
...

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

db.close();
dbManager.close();
2 голосов
/ 25 марта 2011

Важно, чтобы в руководстве при вызове файла обязательно передавался контекст приложения getApplicationContext(), чтобы у вас был доступ к правильным ресурсам, в противном случае вы можете получить исключение FileNotFound.

1 голос
/ 06 января 2016

Вы захотите попробовать Android-помощник sqlite asset . Это сделало открытие уже существующей базы данных куском пирога для меня.

Я буквально заставил его работать примерно через полчаса, потратив 3 часа, пытаясь сделать все это вручную. Забавно, я думал, что делаю то же самое, что и библиотека, но чего-то не хватает!

0 голосов
/ 24 мая 2017

Вам нужно преобразовать вашу базу данных .sqlite в .db, чтобы соответствовать Android.

При первом запуске вашего приложения после установки

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.COPY_TO_SYSTEM);

При последующих запусках

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.READ_FROM_DEVICE);

Просто запускать SQL-запросы

database.sqlInject("INSERT INTO food VALUES('Banana','Vitamin A');");

Получение результатов по массиву в CSV, JSON, XML

ArrayList<String> rows=new ArrayList<String>();
rows=database.sqlEjectCSV("SELECT * FROM food;");
for (int i=0;i<rows.size();i++)
{
    //Do stuffs with each row
}

Вы должны включить мою библиотеку для этого. Документация здесь:
https://github.com/sangeethnandakumar/TestTube

0 голосов
/ 21 апреля 2017

Вы можете читать базу данных только из папки ресурсов, поскольку папки ресурсов доступны только для чтения.Если вам нужно сделать больше операций, таких как создание, обновление, удаление, вы можете сделать трюки.Скопируйте базу данных из папки активов в хранилище, и тогда вы сможете делать все, что захотите.

Вот краткий пример Работа с предварительно созданной базой данных Android.

Существует также простая в использовании библиотека для доступа к базе данных из папки активов.Вы можете проверить Android SQLiteAssetHelper (https://github.com/jgilfelt/android-sqlite-asset-helper). Удачи!

0 голосов
/ 12 октября 2010

Если вы планируете создать новую базу данных SQLite, переверните и внедрите метод onCreate (), как показано в руководстве.

Но если вы используете базу данных SQLite, созданную другим внешним источником, и собираетесь использовать ее, то оставьте метод onCreate () пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...