如何覆盖数据库中的项目而不是创建新项目

Posted

技术标签:

【中文标题】如何覆盖数据库中的项目而不是创建新项目【英文标题】:how to over write item in Database instead of creating new item 【发布时间】:2015-11-20 07:20:54 【问题描述】:

我正在使用 sqlite 数据库,如果我在我的数据库中添加一个现有项目,我希望它覆盖并在其数量上添加 1,我知道这是可能的,但我不知道如何。有人可以帮我吗?如果有人这样做(我是编程新手),我将非常感激这是我的项目*

这是我将项目添加到数据库并在列表视图中显示的窗口

public class pop_up extends Activity 
    int qty;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pop_up);

        EditText quantity = (EditText)findViewById(R.id.quantity);

        quantity.addTextChangedListener(new TextWatcher() 
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) 

                try
                    qty = 1;
                catch(Exception e)

                

            

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) 

            

            @Override
            public void afterTextChanged(Editable s) 
                try
                    qty = Integer.valueOf(s.toString()).intValue();
                catch(Exception e)

                
            
        );

        Intent getpop_up = getIntent();

        final int price = getpop_up.getIntExtra("passedprice", 0);
        final String name = getpop_up.getStringExtra("passedname");



        Button add = (Button) findViewById(R.id.add);




        TextView menuprice = (TextView)findViewById(R.id.menuprice);
        String initialprice = String.valueOf(price);
        menuprice.setText(initialprice);

        TextView menuname = (TextView)findViewById(R.id.menuname);
        String currentname = String.valueOf(name);
        menuname.setText(currentname);


        add.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Toast toast;
                int tprice = ((price)*(qty));

                SQLiteDatabase db = openOrCreateDatabase("Orders.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
                MDB mdb = new MDB(getApplicationContext(), "Orders.db", null, 1);
                db = mdb.getWritableDatabase();
                ContentValues cv = new ContentValues();
                cv.put("Food", name);
                cv.put("Price", tprice);
                cv.put("Quantity", qty);
                db.insert("OrderedList", null, cv);

                toast=Toast.makeText(getApplicationContext(), "Added successfully", Toast.LENGTH_SHORT);

                finish();
                toast.show();
            


        );

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);

        int width=dm.widthPixels;
        int height = dm.heightPixels;

        getWindow().setLayout((int) (width),(int) (height*.6));



    

这是我的列表视图适配器

public class ListView_Adapter extends ArrayAdapter<String> 
    private final Context context;
    private String[] column1;
    private double[] column2;
    private int[] column3;

    public ListView_Adapter(Context context, String[] column1, double[] column2, int[] column3) 
        super(context, R.layout.list_adapter, column1);
        this.context = context;
        this.column1 = column1;
        this.column2 = column2;
        this.column3 = column3;

    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        if (convertView == null) 
            LayoutInflater infalInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_adapter, parent, false);
        
        TextView t1 = (TextView) convertView.findViewById(R.id.t1);
        TextView t2 = (TextView) convertView.findViewById(R.id.t2);
        TextView t3 = (TextView) convertView.findViewById(R.id.t3);

        t1.setText(column1[position]);
        t2.setText("₱" + column2[position]);
        t3.setText("" + column3[position]);
        return convertView;
    
 

【问题讨论】:

您应该在插入新项目之前迭代数据库。如果您的项目的某些唯一标识符匹配,则不要插入。还将您的问题编辑为 您应该为每个项目提供 id,并且在将项目存储到 db 时检查该 id 并增加 db 中的计数,创建一个包含 item_name,item_id 的 myItem pojo 类会更容易 如上所述分配唯一 ID。然后出于性能原因考虑使用Insert or replace,而不是执行往返业务逻辑。 【参考方案1】:

对于我的回答,我假设您熟悉数据库连接的基本概念,并且知道如何从数据库查询中获取结果并执行更新查询。

此外,我假设您有一个 sqlite 数据库,从现在开始有一个名为 table_name 的表和具有唯一 item_name 的项目。

所以你想在你的数据库中插入项目,如果它们已经存在,则在表中增加它们的quantity

检查该项目是否已存在于您的数据库中

在插入新项目时可以更新数据库中的项目之前,您应该检查它是否已经存在。 (假设要插入的项目名称为name

您可以使用这样的选择查询来做到这一点:

SELECT * FROM table_name WHERE item_name = 'name'

执行此查询后,您会得到一个可以检查的结果。之后您将执行两个操作:

如果查询结果为空,则表明该项目尚不存在,并插入一个初始数量为 1 的新项目

否则你知道你只想更新它的数量。

如果已存在则更新项目数量

所以现在当您知道数据库中已经存在一个项目后,您只需更新其数量即可。这可以通过更新查询来完成:(假设要插入的项目的名称为name

UPDATE table_name SET Quantity = Quantity + 1 WHERE item_name = 'name'

【讨论】:

不必要地触发数据库两次。如果您无论如何都想加载 DB 项,这种方法很好,但是当只需要写入时,insert or replace 语法可能会更高效。 是的,我刚刚对您的评论表示赞同,因为我发现您提供的链接非常有用。无论如何,这是我最近采用的方法,所以我只是分享它:)。

以上是关于如何覆盖数据库中的项目而不是创建新项目的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Visual Studio 中的 C# 项目保存到单个 .cs 文件而不是整个项目文件夹中?

如何在复制粘贴时覆盖 VS Code 中的文件(而不是将 *.1* 附加到文件名)?

在方案中设置构建变量而不是目标

sonarqube 混合 obj-c swift 项目,如何扫描代码覆盖率

如何使函数在映射数组中的单个项目而不是数组中的每个项目上执行?

如何自动化而不是每次都为javascript开发创建新的项目结构