При добавлении новой записи в SQLite проверьте, существует ли это имя в Android - PullRequest
0 голосов
/ 28 января 2019

У меня есть 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());
    }
}

1 Ответ

0 голосов
/ 28 января 2019

Самый простой способ - использовать UNIQUE, создавая таким образом столбцы / составные столбцы, которые приведут к конфликту ограничений и, следовательно, не позволят вставить строку.

Что не совсем ясно, так это то, какие столбцы вы используете.имеют в видуЗаголовок показывает, что это столбец name , в этом случае вы можете изменить COl_NAME + " TEXT, " + на COl_NAME + " TEXT UNIQUE, " +.

Текст, как говорится I wan 't проверить, существует ли поисковый URL и собственный URL в БД. Это подразумевает, что только если существует комбинация обоих, вы не хотите добавлять строку, но это комбинация, где только одинстолбцы, которые уже существуют, должны быть добавлены.

Предполагая это, вы можете добавить составное УНИКАЛЬНОЕ ограничение, в этом случае вы можете добавить строку

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

Это будет добавлено после строкиCOL_SEARCHURL + " TEXT" +

Если требуется, чтобы строка не добавлялась, если она существует, вы можете добавить UNIQUE к определениям столбцов, используя: -

            COL_NATIVEURL + " TEXT UNIQUE," +
            COL_SEARCHURL + " TEXT UNIQUE" +
  • Обратите внимание, что addBookMark вернет-1, если строка не была добавлена.

Если вышеприведенное не подходит и вы хотите проверить столбец, вы можете основать эту проверку на чем-то похожем на следующий метод в классе BookmarkDB: -

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
    }
}
  • Очевидно, что это может быть довольно легко адаптировано для других столбцов.

Обратите внимание, что выше в-принципный код и не был проверен или выполнен и, следовательно, содержит некоторые ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...