2012-01-11 3 views
2

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

Здесь пользователь может рассчитать общую сумму, сохранить текущий .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; 

После того, как пользователь нажимает на кнопку сохранить, появляется диалоговое окно с предупреждением о том, что пользователь должен сохранить имя файла как. После ввода пользователем имени и нажатия ok файл копируется и сохраняется в папке, которую я создаю в «data/data/com.project.project/databases/stored_x /». Поэтому я просто делаю копию .db файл и помещать его в другое место.

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

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

+0

Если все базы данных имеют одни и те же таблицы, почему бы не объединить их все в один и иметь поле типа, чтобы отличать их друг от друга? Кажется, что наличие большого количества баз данных - это хакерский способ сделать это. –

+0

Не могли бы вы показать мне пример? Я очень неопытен, работая с базами данных. – JaRay

ответ

0

ИТАК ваш запрос, чтобы получить все элементы типа уточнялось бы быть что-то вроде этого ...

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"}); 
+0

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

Смежные вопросы