2012-01-11 126 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

如果所有的數據庫都有相同的表,爲什麼不把它們合併成一個,並有一個類型字段來區分它們彼此?看起來有一個可變數量的數據庫是一個黑客的做法。 – 2012-01-11 22:42:21

+0

有什麼機會可以給我一個例子嗎?我對數據庫工作經驗不足。 – JaRay 2012-01-12 15:43:20

回答

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 2012-01-17 18:27:19

相關問題