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

相关问题