Доступ к SQLite Helper из адаптера - PullRequest
0 голосов
/ 13 декабря 2018

Код

public class ChatData extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "MessagePlus";

    public ChatData(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }



    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }
    public Cursor getAllQuestions3(MessagesAdapter usageSettings2) {
        return this.getWritableDatabase().query(TABLE_CHAT_DATA,null,null,null,null,null,null);
    }
}

Адаптер

final ChatData mHelper = new ChatData(this);
final Cursor csr = mHelper.getAllQuestions3(this);

Ничего не работает для контекста в адаптере.Это показывает сообщение, чтобы изменить контекст классов Helper на имя Адаптеров, и если я это сделаю, есть красная линия под контекстом в помощнике ... Если я непосредственно пытаюсь получить доступ как ChatData.getWritableDatabase , это показывает, что выя не могу получить доступ к нестатическому методу из статического класса, и если я сделаю этот метод в статическом помощнике, он показывает ошибку там, говоря, что класс не может быть статическим ... одна ошибка ведет к другой, и я не знаю, что делать, может кто-нибудь мне помочьпожалуйста

РЕДАКТИРОВАТЬ

Полный код адаптера

public class MessagesAdapter extends RecyclerView.Adapter<MessagesAdapter.MessageViewHolder>{

private List<SQLiteHelper> mMessagesHelperList;
private FirebaseAuth mAuth;

ChatData mHelper = new ChatData(this);
Cursor csr = mHelper.getAllQuestions3();
public MessagesAdapter(List<SQLiteHelper> mMessagesHelperList) {
    this.mMessagesHelperList = mMessagesHelperList;
}

public class MessageViewHolder extends RecyclerView.ViewHolder{
    public TextView messageText;

    public MessageViewHolder(View view) {
        super(view);
        messageText = (TextView)view.findViewById(R.id.message_text_layout);
    }
}

@Override
public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View V = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_activity_chat,parent,false);
    mAuth = FirebaseAuth.getInstance();
    return new MessageViewHolder(V);
}

@Override
public void onBindViewHolder(final MessageViewHolder holder, int position) {
    String mSender = null;
    String mMessage = null;
    String mTime;
    String mSeen = null;

    String mTimer;
    String mType;
    while (csr.moveToNext()) {
        mSender = csr.getString(csr.getColumnIndex(KEY_SENDER));
        mMessage = csr.getString(csr.getColumnIndex(KEY_MESSAGE));
        mTime = csr.getString(csr.getColumnIndex(KEY_TIME));
        mSeen = csr.getString(csr.getColumnIndex(KEY_SEEN));
        mTimer = csr.getString(csr.getColumnIndex(KEY_TIMER));
        mType = csr.getString(csr.getColumnIndex(KEY_TYPE));
    }

    SQLiteHelper messagesHelper = mMessagesHelperList.get(position);



@Override
public  int getItemCount() {
    return mMessagesHelperList.size();
}

}

Активность

    final MainData mHelper = new MainData(this); //Change the name to your Helper Class name
    final Cursor csr = myDBHlpr.getAllQuestions3(this);
     messageList.setAdapter(mAdapter);
    while (csr.moveToNext()) {
        String mSender = csr.getString(csr.getColumnIndex(KEY_SENDER));
        String mMessage = csr.getString(csr.getColumnIndex(KEY_MESSAGE));
        String mTime = csr.getString(csr.getColumnIndex(KEY_TIME));
        String mSeen = csr.getString(csr.getColumnIndex(KEY_SEEN));
        String mTimer = csr.getString(csr.getColumnIndex(KEY_TIMER));
        String mType = csr.getString(csr.getColumnIndex(KEY_TYPE));

        messages.add(new SQLiteHelper(mSender, mMessage, mTime, mSeen, mTimer, mType));
    }

1 Ответ

0 голосов
/ 13 декабря 2018

Следующее может вызвать некоторые из ваших проблем.То есть вы говорите, что метод должен быть передан MesagesAdapter, когда он не имеет смысла передавать что-либо в метод getAllQuestions3 .

public Cursor getAllQuestions3(MessagesAdapter usageSettings2) {
    return this.getWritableDatabase().query(TABLE_CHAT_DATA,null,null,null,null,null,null);
}

Попытка изменить приведенное выше на

public Cursor getAllQuestions3() {
    return this.getWritableDatabase().query(TABLE_CHAT_DATA,null,null,null,null,null,null);
}

и используйте

ChatData mHelper = new ChatData(this);
Cursor csr = mHelper.getAllQuestions3();

вместо

final ChatData mHelper = new ChatData(this,ChatData.DATABASE_NAME,null,ChatData.DATABASE_VERSION);
final Cursor csr = mHelper.getAllQuestions3(this);

Отметив, что приведенные выше строки должны быть в методе onCreate Activity или методе, вызываемом из onCreate, такчто у вас есть действительный контекст (то есть этот).

Редактировать 1

Обратите внимание, что вышеприведенное было изменено, так как в соответствии с ChatData вам необходимо предоставить 4 параметра для создания экземпляра объекта ChatData.

Я бы предложил изменить конструктор на: -

public ChatData(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
} 

, и тогда вы могли бы использовать ChatData mHelper = new ChatData(this);.


Рабочий пример

Ниже приведен рабочий пример, основанный на указанном вами коде.

Помощник по базе данных ChatData.java

public class ChatData extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "MessagePlus";
    public static final String TABLE_CHAT_DATA = "chatdata";
    public static final String COL_CHATDATA_ID = BaseColumns._ID;
    public static final String COL_CHATDATA_TIMESTAMP = "timestamp";
    public static final String COL_CHATDATA_MESSAGE = "message";
    public static final String COL_CHATDATA_USER = "user";

    public ChatData(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }



    @Override
    public void onCreate(SQLiteDatabase db) {
        String crt_sql = "CREATE TABLE IF NOT EXISTS " + TABLE_CHAT_DATA + "(" +
                COL_CHATDATA_ID + " INTEGER PRIMARY KEY, " +
                COL_CHATDATA_TIMESTAMP + " TEXT DEFAULT CURRENT_TIMESTAMP," +
                COL_CHATDATA_MESSAGE + " TEXT, " +
                COL_CHATDATA_USER + " INTEGER" +
                ")";
        db.execSQL(crt_sql);
    }

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

    }
    public Cursor getAllQuestions3() {
        return this.getWritableDatabase().query(TABLE_CHAT_DATA,null,null,null,null,null,null);
    }

    public long addMessage(String message, long user) {
        ContentValues cv = new ContentValues();
        cv.put(COL_CHATDATA_MESSAGE,message);
        cv.put(COL_CHATDATA_USER,user);
        SQLiteDatabase db = this.getWritableDatabase();
        return db.insert(TABLE_CHAT_DATA,null,cv);
    }
}
  • Примечание, измененное для хранениятаблицы и разрешить добавление строк на вкладкуle.
  • Обратите внимание на конструктор.

Пользовательский адаптер (Cursor Adapter) MessageAdapter.java

public class MessageAdapter extends CursorAdapter {
    public MessageAdapter(Context context, Cursor c, boolean autoRequery) {
        super(context, c, autoRequery);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        return super.getView(position, convertView, parent);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View rv = LayoutInflater.from(context).inflate(
                R.layout.messagelist_item,
                parent,
                false
        );
        return rv;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        TextView mUser = view.findViewById(R.id.user);
        TextView mTimestamp = view.findViewById(R.id.timestamp);
        TextView mMessage = view.findViewById(R.id.message);

        mUser.setText(cursor.getString(cursor.getColumnIndex(ChatData.COL_CHATDATA_USER)));
        mTimestamp.setText(cursor.getString(cursor.getColumnIndex(ChatData.COL_CHATDATA_TIMESTAMP)));
        mMessage.setText(cursor.getString(cursor.getColumnIndex(ChatData.COL_CHATDATA_MESSAGE)));
    }
}

Макет, используемый в списке messagelist_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/user"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/timestamp"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/message"
        android:layout_width="0dp"
        android:layout_weight="8"
        android:layout_height="wrap_content" />
</LinearLayout>

Код в Activity для вывода списка сообщений через адаптер ( MainActivty.java )

public class MainActivity extends AppCompatActivity {

    ChatData mDBHlpr;
    Cursor mCsr;
    MessageAdapter mMesaageAdapter;
    ListView mMessageList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMessageList = this.findViewById(R.id.messagelist);
        mDBHlpr = new ChatData(this);
        addSomeData();
        mCsr = mDBHlpr.getAllQuestions3();
        mMesaageAdapter = new MessageAdapter(this,mCsr,false);
        mMessageList.setAdapter(mMesaageAdapter);

    }

    private void addSomeData() {
        mDBHlpr.addMessage("Hello",1);
        mDBHlpr.addMessage("Hi",2);
        mDBHlpr.addMessage("How are you?",1);
        mDBHlpr.addMessage("I'm OK thanks, and you?",2);
        mDBHlpr.addMessage("Good.",1);
    }
}

Результат

enter image description here

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