Как правильно сохранять информацию из файла .db? - PullRequest
2 голосов
/ 12 января 2012

В нынешнем виде у меня есть TableLayout, который я заполняю на основе определенных столбцов и каждой строки из файла .db. Таблица заполняется на основе одного файла .db, который я теперь буду называть x. Каждый раз, когда действие воссоздается, мой метод заполнения (что заполняет таблицу) проверяет, что находится в x.db. Каждая строка в таблице имеет те же 3 столбца, но если вы долго нажимаете на строку, то вы можете увидеть каждую деталь этой строки (детали рассчитывают один из отображаемых столбцов, и расчет отличается для каждой строки).

Отсюда у пользователя есть возможность рассчитать общую сумму, сохранить текущий файл .db, загрузить другой файл .db или очистить файл .db и начать заново. Вот как я работаю с сохранением и загрузкой, о чем мой вопрос (мне пришлось изменить некоторые имена переменных, чтобы иметь возможность публиковать)

case R.id.save:
            SAVE_DIALOG = R.id.save;

            AlertDialog.Builder save_alert = new AlertDialog.Builder(this,3);

            edit = new EditText(this);
            edit.setSingleLine();
            save_alert.setTitle("Please enter a name to save as");
            save_alert.setView(edit);               
            save_alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {  
                    if(edit.getText().toString().trim().isEmpty()){
                        Toast toast = Toast.makeText(getApplicationContext(), "Name must not be blank", Toast.LENGTH_LONG);
                        toast.show();
                        return;
                    }
                    else {
                    File makeDirectory = new File("data/data/com.project.project/databases/stored_x");
                    if(!makeDirectory.isDirectory())
                        makeDirectory.mkdir();
                    FileChannel fromChannel = null;
                    FileChannel toChannel = null;
                    try {
                        File input = new File("data/data/com.project.project/databases/x.db");
                        //File output = new File("data/data/com.project.project/databases/stored_x/"+ edit.getText() +".db");
                        File output = new File("data/data/com.project.project/databases/stored_x/"+ edit.getText());
                        FileInputStream in = new FileInputStream(input);
                        FileOutputStream out = new FileOutputStream(output);
                        fromChannel = in.getChannel();
                        toChannel = out.getChannel();
                        fromChannel.transferTo(0, fromChannel.size(), toChannel);
                    } 
                    catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }   
                    finally {
                         try {
                            fromChannel.close();
                            } 
                         catch (IOException e) {
                            e.printStackTrace();
                            }
                         try {
                            toChannel.close();
                            }
                         catch (IOException e) {
                            e.printStackTrace();
                            }
                        }
                    }
                }
            });
            save_alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                  }
                 });    
            AlertDialog saveAlert = save_alert.create();
            saveAlert.setCanceledOnTouchOutside(true);
            saveAlert.show();               
            break;

После того, как пользователь нажимает кнопку сохранения, появляется диалоговое окно с предупреждением, запрашивающее у пользователя имя для сохранения файла как. После того, как пользователь ввел имя и нажал «ОК», файл копируется и сохраняется в папке, которую я создаю в «data / data / com.project.project / database / store_x /», поэтому я просто делаю копию .db файл и положить его куда-нибудь еще.

Для загрузки я делаю что-то похожее на сохранение, за исключением того, что я выбрал файл, просматриваю список и заменяю текущий файл x.db этим файлом, теперь называем его x.db.

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

1 Ответ

0 голосов
/ 14 января 2012

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

SELECT * FROM table_name WHERE type='some_type'

Вставить данные в базу данных было бы так ...

INSERT INTO table_name ('name', 'description', 'type') VALUES ('Foo', 'Bar', 'some_type')

Вы можете получить список различных типов, запустив этот запрос

SELECT DISTINCT type FROM table_name

Android имеет встроенные классы, которые делают запрос к базе данных более простым. SQLiteDatabase значительно упрощает запросы к базам данных. Я предпочитаю использовать метод rawQuery () , но вы можете использовать методы-оболочки, если хотите. Вот пример использования метода rawQuery.

db.rawQuery("SELECT * FROM table_name WHERE type=?", new String[] {"some_type"});
...