在 SQLite 中添加新记录时检查此名称是否已存在于 Android

When add new record in SQLite check if this name already exists in Android

我有 SQLite 数据库,我正在那里保存数据,我希望每个新条目都在数据库中检查是否已经存在此记录如果是的话,如果不在数据库中插入记录,请向我显示祝酒消息。 我想检查数据库中是否存在搜索 url 和本机 url。

下面是代码。

public class BookmarkDB extends SQLiteOpenHelper {
    public static final String DBNAME = "bookmarks.db"; // The name of the database file
    public static final int DBVERSION = 1;  // The Database version

    public static final String TBL_BOOKMARK = "bookmark";
    public static final String COL_ID = BaseColumns._ID; // equates to _id
    public static final String COl_NAME = "name";
    public static final String COl_HIDDEN = "hidden";
    public static final String COL_ICON = "icon";
    public static final String COL_NATIVEURL = "nativeurl";
    public static final String COL_SEARCHURL = "searchurl";

    SQLiteDatabase mDB;
    Context mContext;

    public BookmarkDB(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        // The SQL to be used to create the table
        String crt_bookmark_tbl_sql = "CREATE TABLE IF NOT EXISTS " + TBL_BOOKMARK + "(" +
                COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COl_NAME + " TEXT, " +
                COl_HIDDEN + " INTEGER, " +
                COL_ICON + " TEXT, " +
                COL_NATIVEURL + " TEXT," +
                COL_SEARCHURL + " TEXT" +
                ")";
        db.execSQL(crt_bookmark_tbl_sql); // CREATE THE TABLE

    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP IF TABLE EXISTS " + DBNAME);
        onCreate(db);
    }

    public long addBookmark(long id, String name, boolean hidden, String icon, String nativeurl, String searchurl) {
        ContentValues cv = new ContentValues();


                    cv.put(COl_HIDDEN,hidden);
                    cv.put(COl_NAME,name);
                    cv.put(COL_ICON,icon);
                    cv.put(COL_NATIVEURL,nativeurl);
                    cv.put(COL_SEARCHURL,searchurl);
                  return  mDB.insert(TBL_BOOKMARK, null, cv);

        // uses the convenience insert method that builds the SQL
    }
    public ArrayList<Bookmark> getAllBookmarks() {
        ArrayList<Bookmark> rv  = new ArrayList<>();
        Cursor csr = mDB.query(TBL_BOOKMARK,null,null,null,null,null, null);

        while (csr.moveToNext()) {
            Bookmark b = new Bookmark();
            b.setId(csr.getString(csr.getColumnIndex(COL_ID)));
            int Icon = csr.getInt(csr.getColumnIndex(COL_ICON));
            String name = csr.getString(csr.getColumnIndex(COl_NAME));
            String searchUrl = csr.getString(csr.getColumnIndex(COL_SEARCHURL));
            b.setIcon(Icon);
            b.setName(name);
            b.setSearchUrl(searchUrl);
            b.setViewType(csr.getInt(csr.getColumnIndex(COl_NAME)));
            b.setNativeUrl(csr.getString(csr.getColumnIndex(COL_NATIVEURL)));
            rv.add(b);
        }
        return rv;

    }

    public void deleteBookmark(int id, String name){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "DELETE FROM " + TBL_BOOKMARK + " WHERE "
                + COL_ID + " = '" + id + "'" +
                " AND " + COl_NAME + " = '" + name + "'";

        Log.d("Deleted", "Item" + query);
        db.execSQL(query);
    }

}

保存新记录的代码

public class ActivityChangeBookmark  extends AppCompatActivity {
    private ArrayList<String> listItems = new ArrayList<String>();
    private RecyclerView recyclerView;
    Button saveBookmark, cancelBookmark;
    TextView name, url;
    ImageView icon, mIcon;
    EditText mName, mUrl, mID;
    public static final String Save_Bookmark = "Save_Bookmark";
    static final String xmlFileName = "bookmarks.xml";
    String Url, Name;
    Integer Id;
    MyAdapter myAdapter;
     BookmarkDB bookmarkDB;
     ButtonRobotoMedium removeBookmark, sendToHomeScreen;
    ArrayList<Bookmark> arrayList = new ArrayList<>();


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_change_bookmark);
        saveBookmark = findViewById(R.id.btnSave);
        name = findViewById(R.id.tvNameEdit);
        url = findViewById(R.id.tvURLEdit);
        recyclerView = findViewById(R.id.myRecyclerView);
        icon = findViewById(R.id.ivFavIcon);
        mName = findViewById(R.id.etNameEdit);
        mUrl = findViewById(R.id.etURLEdit);
        cancelBookmark = findViewById(R.id.btnCancel);
        removeBookmark = findViewById(R.id.btnRemove);
        sendToHomeScreen = findViewById(R.id.btnAddIconToDeviceScreen);
        name.setVisibility(View.GONE);
        url.setVisibility(View.GONE);
        bookmarkDB = new BookmarkDB(getApplicationContext());
        Intent intent = getIntent();
        myAdapter = new MyAdapter(getApplicationContext(), arrayList);

        Bundle extras = intent.getExtras();
        if (extras != null) {
            Url = intent.getExtras().getString("Url");
            Name = intent.getExtras().getString("Name");
            Id = intent.getExtras().getInt("ID");

            Bitmap bitmap = intent.getExtras().getParcelable("Image");
            mName.setText(Name);
            mUrl.setText(Url);
            Log.d("Id", "TakenId" + Id + Name + Url);

            icon.setImageBitmap(bitmap);
            removeBookmark.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("DeletedItem", "Test" + Id + Name);
                    bookmarkDB.deleteBookmark(Id, Name);
                    myAdapter.notifyDataSetChanged();
                    finish();
                }
            });
        }
         else {
            removeBookmark.setVisibility(View.GONE);
            sendToHomeScreen.setVisibility(View.GONE);
            icon.setImageResource(R.drawable.user_bookmark);
            mName.setText("");
            mUrl.setText("");
        }



        saveBookmark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveData();
                myAdapter.notifyDataSetChanged();
                finish();
                }
        });

        cancelBookmark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myAdapter.notifyDataSetChanged();
                finish();
            }
        });
    }

    public void saveData() {
        Random r = new Random();
        int low = 14;
        int high = 100;
        int result = r.nextInt(high-low) + low;
        bookmarkDB.addBookmark(result, mName.getText().toString(), false, "", mUrl.getText().toString(), "http://" + mUrl.getText().toString());
    }
}

最简单的方法是利用 UNIQUE,从而生成 column/composite 列,这将导致约束冲突,因此不允许插入行。

不太清楚的是您指的是哪些专栏。标题似乎表明它是 name 列,在这种情况下,您可以将 COl_NAME + " TEXT, " + 更改为 COl_NAME + " TEXT UNIQUE, " +.

文本如何说明 我不想检查数据库中是否存在搜索 url 和本机 url。 这意味着只有当两者的组合存在时您才不想添加该行,但应该添加其中只有一个列已经存在的组合。

假设这样,那么您可以添加复合 UNIQUE 约束,在这种情况下,您可以添加行

", UNIQUE(" + COL_NATIVEURL + "," + COL_SEARCHURL + ")" +

这将添加到 COL_SEARCHURL + " TEXT" +

行之后

如果不希望添加该行(如果存在的话),那么您可以使用以下方法将 UNIQUE 添加到列定义中:-

            COL_NATIVEURL + " TEXT UNIQUE," +
            COL_SEARCHURL + " TEXT UNIQUE" +
  • 请注意,如果未添加该行,addBookMark 会 return -1。

如果以上不适合并且您想检查一列,那么您可以根据 BookmarkDB class 中的以下方法进行检查:-

public boolean ifNativeUrlExists(String nativeUrl) {

    boolean rv = false;
    String whereclause = COL_NATIVEURL + "=?";
    String[] whereargs = new String[]{nativeUrl};
    Cursor csr = mDB.query(TBL_BOOKMARK,null,whereclause,whereargs,null,null, null)
    if (csr.getCount() > 0) {
        rv = true;
    }
    csr.close();
    return rv;
}

您可以使用类似的东西来利用它:-

public void saveData() {
    Random r = new Random();
    int low = 14;
    int high = 100;
    int result = r.nextInt(high-low) + low;
    if (!bookmarkDB.ifNativeUrlExists(mUrl.getText().toString())) {
        bookmarkDB.addBookmark(result, mName.getText().toString(), false, "", mUrl.getText().toString(), "http://" + mUrl.getText().toString());
    } else {
         ..... code to indicate not added
    }
}
  • 显然,这可以很容易地适用于其他列。

请注意,以上是 in-principle 代码,尚未经过测试,或者 运行 并且因此包含一些错误。