База данных SQLite для комментирования - PullRequest
0 голосов
/ 04 февраля 2019

Нет ошибок с кодами.Тем не менее, я пытаюсь создать раздел комментариев, в котором имя и комментарии будут сохранены в базе данных (SQLite).

1) Он не останется в Textview после того, как я вернусь с другой страницы.2) Пример, я прокомментировал один раз, и комментарий показывает.Я прокомментирую снова, на самом деле он снова отображает предыдущие и новые комментарии вместе.

public class BuyerHome extends AppCompatActivity {
DatabaseHelper2 myDB;
//EditText name,comment;

EditText nameIn;
EditText commentIn;
TextView viewComment;

Button postComment;



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

    nameIn = (EditText) findViewById(R.id.nameInput);
    commentIn = (EditText) findViewById(R.id.commentText);
    viewComment = (TextView) findViewById(R.id.viewCommentText);
    myDB = new DatabaseHelper2(this);



    postComment = (Button) findViewById(R.id.buttonComment);

    postComment.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String name = nameIn.getText().toString();
            String comment = commentIn.getText().toString();

            if(nameIn.length()!=0 && commentIn.length()!=0){
                AddData(name,comment);
                nameIn.setText("");
                commentIn.setText("");
            }else{
                Toast.makeText(BuyerHome.this, "Insert fields", 
Toast.LENGTH_SHORT).show();
            }

            Cursor data = myDB.getContents();

            if(data.getCount()==0){
                Toast.makeText(BuyerHome.this, "Database empty", 
Toast.LENGTH_SHORT).show();
            }
            else{

                while(data.moveToNext()){
                    viewComment.append(data.getString(1));
                    viewComment.append(data.getString(2)+"\n");
                }
            }

            //viewComment.append("\n"+name+":"+comment);




    }
});
}
    public void AddData(String name,String comment){
    boolean insertData = myDB.insertData(name,comment);

    if(insertData==true){
        Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();
    }else{
        Toast.makeText(this, "Fail", Toast.LENGTH_SHORT).show();
    }
      }
}

1) Я бы хотел, чтобы прошлые комментарии были там, пока страница доступна.2) Мне бы хотелось, чтобы отображался только последний комментарий (поверх предыдущих комментариев), а не предыдущие комментарии (повторное отображение) с новым комментарием.

1 Ответ

0 голосов
/ 04 февраля 2019

Я бы посоветовал использовать второе представление для старых комментариев.Вам также потребуется средство определения самого последнего, в отличие от более старых комментариев.

В приведенном ниже примере второе представление представляет собой просмотр списка (это позволит вам щелкнуть конкретное сообщение, возможно, процитировать его, возможно извлечьимя).

В примере рассматриваются два способа определения последнего опубликованного комментария с помощью столбца id (примечание _id фактически используется в качестве имени столбца, так какзатем позволяет использовать адаптер курсора для ListView, что может быть полезным).

Для облегчения отображения комментариев после возврата метода onResume был переопределен в действии.

вот код: -

DatabaseHelper2.java

public class DatabaseHelper2 extends SQLiteOpenHelper {

    private final static String DBNAME = "buyerdb";
    private final static int DBVERSION = 1;

    public final static String TBL_COMMENT = "comment";
    public final static String COL_COMMENT_ID = BaseColumns._ID;
    public final static String COL_COMMENT_NAME = "name";
    public final static String COL_COMMENT_COMMENT = "comment";
    public final static String COl_COMMENT_TIMESTAMP = "timestamp";

    private String crt_tbl_comment = "CREATE TABLE IF NOT EXISTS " + TBL_COMMENT + "(" +
            COL_COMMENT_ID + " INTEGER PRIMARY KEY, " +
            COL_COMMENT_NAME + " TEXT," +
            COL_COMMENT_COMMENT + " TEXT, " +
            COl_COMMENT_TIMESTAMP + " TEXT DEFAULT CURRENT_TIMESTAMP" +
            ")";

    SQLiteDatabase mDB;

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(crt_tbl_comment);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public long addData(String name, String comment) {
        ContentValues cv = new ContentValues();
        cv.put(COL_COMMENT_NAME,name);
        cv.put(COL_COMMENT_COMMENT,comment);
        return mDB.insert(TBL_COMMENT,null,cv);
    }

    public Cursor getLatestComment() {
        return mDB.query(TBL_COMMENT,null,null,null,null,null,COl_COMMENT_TIMESTAMP + " DESC","1");
    }

    public Cursor getAllButLatestComment() {
        String whereclause = COL_COMMENT_ID + " < (SELECT max(" +
                COL_COMMENT_ID +
                ") FROM " + TBL_COMMENT +
                ")";
        return mDB.query(TBL_COMMENT,null,whereclause,null,null,null,COl_COMMENT_TIMESTAMP + " DESC");
    }
}
  • Обратите внимание, что столбец timestamp не использовался, но мог быть, так как при добавлении строки (комментария) текущая временная метка будет автоматически использоваться для установки столбца.

  • Обратите внимание на getLatestComment и getAllButLatestCМетоды omment возвращают курсор с соответствующими строками.

BuyerHome.java

public class BuyerHome extends AppCompatActivity {

    EditText nameIn;
    EditText commentIn;
    TextView viewComment;
    Button postComment;
    ListView olderComments; //<<<<<<<<<< Added (Listview needs to be added to the layout)

    DatabaseHelper2 myDB;
    Cursor oldermessages, latestmessage; //<<<<<<<<<< Added
    SimpleCursorAdapter sma; //<<<<<<<<<< Added adapter for the ListView

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

        nameIn = (EditText) findViewById(R.id.nameInput);
        commentIn = (EditText) findViewById(R.id.commentText);
        viewComment = (TextView) findViewById(R.id.viewCommentText);
        olderComments = (ListView) findViewById(R.id.olderComments); //<<<<<<<<<< Added

        myDB = new DatabaseHelper2(this);
        postComment = (Button) findViewById(R.id.buttonComment);
        postComment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = nameIn.getText().toString();
                String comment = commentIn.getText().toString();

                if (nameIn.length() != 0 && commentIn.length() != 0) {
                    myDB.addData(name, comment); //<<<<<<<<<< method starts changed lower case a
                    nameIn.setText("");
                    commentIn.setText("");
                } else {
                    Toast.makeText(BuyerHome.this, "Insert fields",
                            Toast.LENGTH_SHORT).show();
                }
                displayComments(); //<<<<<<<<<< added to refresh the display according to the latest comments
            }
        });
    }

    //<<<<<<<<<< ADDED so will display comments whenever called including returning from another activity
    @Override
    protected void onResume() {
        super.onResume();
        displayComments();
    }

    //<<<<<<<<<< ADDED entire method for displaying comments
    private void displayComments() {
        latestmessage = myDB.getLatestComment();
        if (latestmessage.moveToFirst()) {
            viewComment.setText(latestmessage.getString(latestmessage.getColumnIndex(DatabaseHelper2.COL_COMMENT_NAME)) +
                    " said :- " +
                    latestmessage.getString(latestmessage.getColumnIndex(DatabaseHelper2.COL_COMMENT_COMMENT)));
        } else {
            viewComment.setText("");
        }
        oldermessages = myDB.getAllButLatestComment();
        if (sma == null) {
            sma = new SimpleCursorAdapter(
                    this,
                    android.R.layout.simple_list_item_2,oldermessages,
                    new String[]{DatabaseHelper2.COL_COMMENT_NAME,DatabaseHelper2.COL_COMMENT_COMMENT},
                    new int[]{android.R.id.text1,android.R.id.text2},
                    0
            );
            olderComments.setAdapter(sma);
        } else {
            sma.swapCursor(oldermessages);
        }
    }
}

Результат

enter image description here

  • Выделенная строка - это последний комментарий.
  • За последним комментарием следует список всех остальных комментариев.
...