Как отобразить данные из базы данных sqlite в папке активов? - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу отобразить данные из test.db в папке активов в представлении списка.Я искал в интернете, но еще не нашел.Это пример моей базы данныхhelper.

В базе данных test.db есть [номера, имена, школы].Как я могу отобразить данные?Я хочу отобразить данные из test.db в папке активов в представлении списка.Я искал в интернете, но еще не нашел.Это пример моей базы данныхhelper.

В базе данных test.db есть [номера, имена, школы].Как я могу отобразить данные?Я хочу отобразить данные из test.db в папке активов в представлении списка.Я искал в интернете, но еще не нашел.Это пример моей базы данныхhelper.

В базе данных test.db есть [номера, имена, школы].Как отобразить данные?

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "test.db";
    private static final int DATABASE_VERSION = 1;
    private final Context context;
    SQLiteDatabase db;

    private static final String DATABASE_PATH = "/data/data/"+context.getPackageName()+"/databases/";
    private final String USER_TABLE = "user";


    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
        createDb();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

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

    public void createDb(){
        boolean dbExist = checkDbExist();

        if(!dbExist){
            this.getReadableDatabase();
            copyDatabase();
        }
    }

    private boolean checkDbExist(){
        SQLiteDatabase sqLiteDatabase = null;

        try{
            String path = DATABASE_PATH + DATABASE_NAME;
            sqLiteDatabase = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
        } catch (Exception ex){
        }

        if(sqLiteDatabase != null){
            sqLiteDatabase.close();
            return true;
        }

        return false;
    }

    private void copyDatabase(){
        try {
            InputStream inputStream = context.getAssets().open(DATABASE_NAME);

            String outFileName = DATABASE_PATH + DATABASE_NAME;

            OutputStream outputStream = new FileOutputStream(outFileName);

            byte[] b = new byte[1024];
            int length;

            while ((length = inputStream.read(b)) > 0){
                outputStream.write(b, 0, length);
            }

            outputStream.flush();
            outputStream.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private SQLiteDatabase openDatabase(){
        String path = DATABASE_PATH + DATABASE_NAME;
        db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
        return db;
    }
    public void close(){
        if(db != null){
            db.close();
        }
    }

1 Ответ

0 голосов
/ 01 февраля 2019

Как отобразить данные?

Вам необходимо решить, как / где вы хотите, чтобы данные отображались.Если предположить в Activity и через ListView, то: -

Затем вы извлечете данные с помощью запроса, возможно, используя SQLiteDatabase query метод для извлечения Cursor.

Затем вы можете через адаптер курсора, например, SimpleCursorAdapter

  • Обратите внимание, что для CursorAdapters требуется столбец с именем _id , идолжен быть псевдонимом столбца rowid .

отображать строки в ListView .

Puttingэто вместе

Следующий код (примечание показывает только имя и школу в списке, вы можете создать подходящий макет) - это рабочий пример, основанный на базе данных ( test.db ), содержащейтаблица с именем пользователь , в которой есть столбцы числа , имя и школа

  • Примечание Справка базы данных была изменена для работы с Android 9 +

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "test.db";
    private static final int DATABASE_VERSION = 1;
    private static String DATABASE_PATH;
    private final Context context;
    SQLiteDatabase db;

    //private static final String DATABASE_PATH = "/data/data/" + context.getPackageName() + "/databases/"; //<<<<<<<<<< no need to hard code anything see below
    public final static String USER_TABLE = "user";
    public final static String USER_NUMBERS_COLUMN = "numbers";
    public final static String USER_NAME_COLUMN = "name";
    public final static String USER_SCHOOL_COLUMN = "school";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
        DATABASE_PATH = context.getDatabasePath(DATABASE_NAME).getPath(); //<<<<<<<<<< Recommended way
        createDb();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

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

    public void createDb() {
        boolean dbExist = checkDbExist();

        if (!dbExist) {
            //this.getReadableDatabase(); //<<<<<<<< will mess up Android 9 as it creates -wal and -shm files
            copyDatabase();
        }
    }

    private boolean checkDbExist() {

        /**
         * Checks the file instead of trying to open the database,
         * makes directories if needed (the get around to this was opening the database to create them)
         */
        File db = new File(DATABASE_PATH);
        if (!db.exists()) {
            if(!new File(db.getParent()).exists()) {
                new File(db.getParent()).mkdirs();
            }
            return false;
        } else {
            return true;
        }

        /* Done away with unreliable method
        SQLiteDatabase sqLiteDatabase = null;
        try {
            String path = DATABASE_PATH;
            sqLiteDatabase = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
        } catch (Exception ex) {
        }
        if (sqLiteDatabase != null) {
            sqLiteDatabase.close();
            return true;
        }
        return false;
        */
    }

    private void copyDatabase() {
        try {
            InputStream inputStream = context.getAssets().open(DATABASE_NAME);
            String outFileName = DATABASE_PATH;
            OutputStream outputStream = new FileOutputStream(outFileName);

            byte[] b = new byte[1024];
            int length;
            while ((length = inputStream.read(b)) > 0) {
                outputStream.write(b, 0, length);
            }
            outputStream.flush();
            outputStream.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private SQLiteDatabase openDatabase() {
        String path = DATABASE_PATH;
        db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
        return db;
    }

    public void close() {
        if (db != null) {
            db.close();
        }
    }

    /**
     * Extract all columns for all rows adding column _id for CursorAdapter
     */
    public Cursor getAllMyData() {
        SQLiteDatabase db = this.getWritableDatabase();
        String[] columns = new String[]{"*,rowid AS " + BaseColumns._ID};
        return db.query(
                USER_TABLE,columns,
                null,null,null,null,null);
    }
}
  • Примечания
    • см. Комментарии для некоторых объяснений
    • некоторый старый код был оставлен, но закомментирован

MainActivity.java

Это действие, которое использовалось и включает ListView

 public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDBHlpr;
    Cursor mCsr;
    ListView mUserList;
    SimpleCursorAdapter mSCA;
    Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        mUserList = this.findViewById(R.id.userlist); //<<<<<<<<<< id of the ListView
        mDBHlpr = new DatabaseHelper(this); //Instantiate the database helper
        setupOrRefreshTheListView();
    }

    private void setupOrRefreshTheListView() {
        mCsr = mDBHlpr.getAllMyData();
        if (mSCA == null) {
            mSCA = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_2,
                    mCsr,
                    // Columns from the Cursor to include in the ListView (must have a corresponding view in the layout)
                    new String[]{
                            DatabaseHelper.USER_NAME_COLUMN,
                            DatabaseHelper.USER_SCHOOL_COLUMN
                    },
                    // Views in the ListView into which the Data is placed (must correspond with Column in the Cursor)
                    new int[]{
                            android.R.id.text1,
                            android.R.id.text2},
                    0
            );
            mUserList.setAdapter(mSCA);
            // Add an on item click listener in this case Toasts data
            mUserList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Toast.makeText(
                            mContext,
                            "You clicked the row with an ID of " + String.valueOf(id) +
                                    " Name is " + mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.USER_NAME_COLUMN)) +
                                    " School is " + mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.USER_SCHOOL_COLUMN)) +
                                    " Numbers is " + String.valueOf(mCsr.getInt(mCsr.getColumnIndex(DatabaseHelper.USER_NUMBERS_COLUMN))),
                            Toast.LENGTH_SHORT).show();
                }
            });
        } else {
            mSCA.swapCursor(mCsr); // This reapplies the Cursor to reflect any changes
        }
    }
}

Выше было выполнено для API 21 (Lollipop), а также 28 (Pie).Ниже приведен пример снимка экрана: -

enter image description here

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