自动增量在 SQLite 数据库中不起作用

Auto increment is not working in SQLite database

我在 sqlite 数据库中工作。我有一个产品 table,它有一个产品 ID、名称、价格和一个公司 ID,当我将产品添加到数据库时,我将其作为主键和自动增量,但 productid 似乎是空的

这是我的数据库的屏幕截图

这是我的数据库class

package com.example.abdelmagied.myapplication;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by AbdELMagied on 7/24/2017.
 */

public class database extends SQLiteOpenHelper {


    private static final String DATABASE_NAME = "product.db";
    private static final String TABLE_NAME    = "myproduct";

  /// columns in the database
    private static final String COL1_NAME     = "productId";
    private static final String COL2_NAME     = "productSalary";
    private static final String COL3_NAME     = "companyname";
    private static final String COL4_NAME     = "productName";


    // constructor
    public database(Context context) {

        super(context, DATABASE_NAME  , null , 1);
    }


    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("create table myproduct ("+COL1_NAME+" integer primary key  autoincrement, "+COL2_NAME+" text , "+COL3_NAME+" text , "+COL4_NAME+" text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
           sqLiteDatabase.execSQL("drop database " + DATABASE_NAME );
           onCreate(sqLiteDatabase);
    }
}

这是我插入数据库的activity

package com.example.abdelmagied.myapplication;

import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class addproduct extends AppCompatActivity {
    public Button AddToDatabase;
    public EditText productName , productSalary , companyMade;

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

        // get the button id
         AddToDatabase = (Button) findViewById(R.id.AddDatabase);

        // handle the action of the click
        AddToDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // get the entered info from the edittexts
                productName   = (EditText) findViewById(R.id.PNameId);
                productSalary =(EditText) findViewById(R.id.PSalaryId);
                companyMade   = (EditText) findViewById(R.id.PSalaryId);

                //add to database productName , productSalary , companyMade...
                  database mydata = new database(getApplicationContext());
                  SQLiteDatabase db = mydata.getWritableDatabase();
                  ContentValues content = new ContentValues();
                  content.put("productSalary"  , productSalary.getText().toString());
                  content.put("companyname" , companyMade.getText().toString());
                  content.put("productName" , productName.getText().toString());
                  db.insert("myproduct" , null , content);

            }
        });

    }
}

使用您的 SQL 创建 table 即

`sqLiteDatabase.execSQL("create table myproduct ("+COL1_NAME+" integer primary key  autoincrement, "+COL2_NAME+" text , "+COL3_NAME+" text , "+COL4_NAME+" text)");`

然后使用下面的测试:-

            dbhlp = new SO45290855(this);

            SQLiteDatabase dbx = dbhlp.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(SO45290855.COL2_NAME,"xxxx");
            cv.put(SO45290855.COL3_NAME,"yyyy");
            cv.put(SO45290855.COL4_NAME,"zzzz");
            dbx.insert(SO45290855.TABLE_NAME,null,cv);
            ContentValues cv2 = new ContentValues();
            cv2.put(SO45290855.COL2_NAME,"xxxx");
            cv2.put(SO45290855.COL3_NAME,"yyyy");
            cv2.put(SO45290855.COL4_NAME,"zzzz");
            dbx.insert(SO45290855.TABLE_NAME,null,cv);


            Cursor csr = dbx.query(SO45290855.TABLE_NAME,null,null,null,null,null,null);

            while (csr.moveToNext()) {
                for (int i=0; i < csr.getColumnCount();i++) {
                    Log.d("CsrPos_" + Integer.toString(csr.getPosition()),
                            "Column=" + csr.getColumnName(i) +
                                    " Data=" + csr.getString(i)
                    );
                }
            }

给出的输出是:-

07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=productId Data=1
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=productSalary Data=xxxx
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=companyname Data=yyyy
07-25 09:30:41.721 2965-2965/? D/CsrPos_0: Column=productName Data=zzzz
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=productId Data=2
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=productSalary Data=xxxx
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=companyname Data=yyyy
07-25 09:30:41.721 2965-2965/? D/CsrPos_1: Column=productName Data=zzzz

SO45290855 是您数据库的副本 class

因此,由于第一行显示 productId 的值为 1 并且第 5 行显示 porductId,在第二行,值为2,原则上你的代码应该创建相同的。

因此很可能您修改了代码以更改结构但没有意识到 onCreate 基本上在数据库文件的生命周期内运行一次,因此除非您删除了数据库文件,不会应用对结构的更改。

可能的解决方法是清除应用程序的数据或卸载应用程序并重新运行。

除此之外,您很可能不需要使用 column_name INTEGER PRIMARY KEY 编写 AUTOINCREMENT 代码,这将导致列递增。

我建议阅读 SQLite Autoincrement ,其中包括

The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and disk I/O overhead and should be avoided if not strictly needed. It is usually not needed.