【问题标题】:What is the proper way to save information from a .db file?从 .db 文件中保存信息的正确方法是什么?
【发布时间】:2012-01-11 21:28:49
【问题描述】:

就目前而言,我有一个基于 .db 文件中的某些列和每一行填充的 TableLayout。该表是基于单个 .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/databases/stored_x/”中创建的文件夹中,所以我只是制作.db的副本文件并将其放在其他地方。

为了加载,我做了类似于保存的操作,除了我选择了文件视图列表视图并将当前的 x.db 替换为此文件,现在将其称为 x.db。

一切正常,对最终用户来说也能正常工作,但我只是好奇这是否是应该的方式。

【问题讨论】:

  • 如果所有数据库都有相同的表,为什么不将它们全部合并为一个并有一个类型字段来区分它们呢?拥有可变数量的数据库似乎是一种骇人听闻的方式。
  • 你能给我举个例子吗?我对使用数据库非常缺乏经验。

标签: android sqlite loading save


【解决方案1】:

好的,因此您获取指定类型的所有项目的查询将是这样的......

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

【讨论】:

  • 伙计,我真的需要精通数据库。感谢您的帮助,我现在将尝试实现它,看看它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
相关资源
最近更新 更多