【问题标题】:Android Drop a SQLite table [duplicate]Android删除一个SQLite表[重复]
【发布时间】:2017-02-22 23:41:00
【问题描述】:

我正在构建一个应用程序,我必须在 SQLite 数据库上创建多个表。

我可以举出的最好例子是我必须管理的一家商店,因此我要为我必须管理的每种产品类别(葡萄酒、啤酒、牛奶等)创建一张表我正在销售的品牌,但如果我停止销售其中一个类别,我希望能够删除此类别表。

但是我尝试了很多来自网络的示例,但没有任何效果。我总是遇到同样的错误。

因为我的表上有很多项目,所以我构建了一个自定义列表视图和一个自定义适配器,两者都运行良好,我可以毫无问题地删除或添加新项目,构建新表,但相同的方法不起作用删除我构建的表格。

我故意让我的数据库打开,直到我的活动被破坏,所以我不必通过我的适配器打开它。

也许有人可以帮助我如何使用一个按钮删除带有从字符串传递的名称的表,或者在这种情况下,使用我的适配器按钮会非常有帮助,因为我的想法是在我的列表视图上添加按钮。

为了清楚起见,如果我创建一个 editText 来输入我的表格名称并使用一个按钮来运行此代码,我可以删除表格:

dataBase.execSQL("DROP TABLE IF EXISTS '" + tableName + "'");

或者如果我在方法 onCreate 的执行期间运行此代码,并且我从一个真正存在的表中给出一个名称。

dataBase.execSQL("DROP TABLE IF EXISTS 'test 1'");

所以我的问题不是如何处理NullPointerException,而是如何从我的自定义适配器操作我的 SQLite 数据库。

谢谢!

这是我的适配器代码:

public class MyCustomAdapter extends BaseAdapter implements ListAdapter {
private ArrayList<String> list = new ArrayList<String>();
private Context context;
private SQLiteDatabase dataBase;
private String tableName;

public MyCustomAdapter(ArrayList<String> list, Context context) {
    this.list = list;
    this.context = context;
}

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int pos) {
    return list.get(pos);
}

@Override
public long getItemId(int pos) {
    //return list.get(pos).getId();

    //just return 0 if your list items do not have an Id variable.
    return 0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.list_item_clickable, null);
    }

    //Handle TextView and display string from your list
    TextView listItemText = (TextView)view.findViewById(R.id.list_item_textview);
    listItemText.setText(list.get(position));

    //Handle buttons and add onClickListeners
    Button deleteBtn = (Button)view.findViewById(R.id.delete_btn);

    deleteBtn.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {

            //criar alertDialog
            AlertDialog.Builder  dialog = new AlertDialog.Builder(context);

            dialog.setTitle("Delete!");

            dialog.setMessage("Do you wish to delete this ToDo list?");

            dialog.setCancelable(false);

            dialog.setIcon(android.R.drawable.ic_delete);

            dialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    Toast.makeText(context, "No!", Toast.LENGTH_SHORT).show();
                }
            });

            dialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) { 
                    final String tableName= list.get( position ).toString();

                    try {

                        dataBase.execSQL("DROP TABLE IF EXISTS '" + tableName + "'");
                                //dataBase.execSQL("DROP TABLE IF EXISTS 'test 1'");

                                list.remove(position); //or some other task

                                    Toast.makeText(context, "Tabela " + tableName + " removida com sucesso!", Toast.LENGTH_SHORT).show();
                                    notifyDataSetChanged();


                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            });

            dialog.create();
            dialog.show();

        }
    });

    listItemText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //Toast.makeText(context, "Item position is: " + list.get(position), Toast.LENGTH_SHORT).show();

            Intent intent = new Intent(context, MainActivity.class);
            String tabelaNome = list.get( position ).toString();

            intent.putExtra("tableName", tableName);

           context.startActivity(intent);
        }
    });

    return view;
}

Error message

【问题讨论】:

  • “我总是遇到同样的错误。”什么错误?
  • 您好,谢谢!我忘了...我会用错误更新帖子。这是我第一次发布问题。
  • 请编辑您的问题
  • 注意表名中的空格是有问题的
  • 你是对的,但它在我的名为 test 的桌子上也不起作用。我还添加了双引号和单引号的问题,现在它可以工作了,但这完全超出了我的理解。

标签: android mysql database sqlite custom-adapter


【解决方案1】:

注意两个 SQL 语句之间的区别:

dataBase.execSQL("DROP TABLE IF EXISTS '" + tableName + "'");
dataBase.execSQL("DROP TABLE IF EXISTS teste 1"); 

你说的有效的表名没有引号。

【讨论】:

  • 嗯,不同之处在于,在第一个中,我尝试传递一个名为 tableName 的字符串值,而在第二个中,我构建了一个名为 teste 1 的表,只是为了尝试问题是否存在从传递的值,或者如果 SQL 代码没有被正确执行。但是从我的适配器执行代码时,它们都不起作用。
  • @CurtesMalteser 不管怎样,SQ 语法是一样的
  • 我知道,如果我在 onCreate 方法上运行此代码时使用此 systax 效果很好,或者如果我正在使用 databaseHelper 但是,当我尝试将值传递给它时它只是行不通。我正在处理要分享的错误...
  • @CurtesMalteser “不起作用”是什么意思?
  • 它不会删除带有传递名称的表,即使它存在。我刚刚分享了消息错误的屏幕截图。它应该可以工作,因为我使用相同的方法来构建表并从这些表中添加或删除项目。我只是没有在这里得到错误,这就是我决定第一次使用 stackoverflow 的原因。
猜你喜欢
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
相关资源
最近更新 更多