id不会以长格式保存在数据库sqlite中

rfbsl7qr  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(384)

我正在制作一个android笔记应用程序,它可以保存一个笔记并在笔记列表中显示它。如果你触摸每个音符,它会在另一个布局中显示标题和细节。我可以保存笔记并在列表中显示它们,但我的问题是当我试图使用intent来显示特定笔记的标题和详细信息时。
我们要做的是使用intent.putextra(“id”,…)并获取该意图,并使用其id显示便笺的详细信息和标题。但是我得到“android.database.cursorindexoutofboundsexception”错误和应用程序崩溃。
这是我笔记课的一部分:

public class Note {

private String Title, Content, Date, Time;
private long ID;

Note(){}
Note(String Title,String Content,String Date,String Time){
    this.Title = Title;
    this.Content = Content;
    this.Date = Date;
    this.Time = Time;
}

Note(long ID,String Title,String Content,String Date,String Time) {
    this.ID = ID;
    this.Title = Title;
    this.Content = Content;
    this.Date = Date;
    this.Time = Time;
}

这是我的记事本数据库:
公共类notedatabase扩展了sqliteopenhelper{

private static final int DATABASE_VERSION = 2;
private static final String DATABASE_NAME = "notedbs";
private static final String DATABASE_TABLE = "notestables";

//column name for database tables
private static final String KEY_ID = "id";
private static final String KEY_TITLE = "title";
private static final String KEY_CONTENT = "content";
private static final String KEY_DATE = "date";
private static final String KEY_TIME = "time";

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

@Override
public void onCreate(SQLiteDatabase db){
    //create table
    String query = "CREATE TABLE " + DATABASE_TABLE + "("+
            KEY_ID + " INT PRIMARY KEY," +
            KEY_TITLE + " TEXT," +
            KEY_CONTENT + " TEXT," +
            KEY_DATE + " TEXT," +
            KEY_TIME + " TEXT" + ")";

    db.execSQL(query);
}

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

    if(oldVersion >= newVersion) {
        return;
    } else {
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }
}

public long addNote(Note note) {
    SQLiteDatabase db= this.getWritableDatabase();
    ContentValues c = new ContentValues();
    c.put(KEY_TITLE,note.getTitle());
    c.put(KEY_CONTENT,note.getContent());
    c.put(KEY_DATE,note.getDate());
    c.put(KEY_TIME,note.getTime());

    long ID = db.insert(DATABASE_TABLE,"null",c);
    //c.put(KEY_ID,ID);
    Log.d("Inserted", "addNote: note with id number " + KEY_ID + " has been inserted");
    return ID;
}

public Note getNote(long ID){
    //Select * from DatabaseTable where id = 1
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = db.query(DATABASE_TABLE,
            new String []{KEY_ID,KEY_TITLE,KEY_CONTENT,
            KEY_DATE,KEY_TIME},KEY_ID + "=?",
            new String[]{String.valueOf(ID)},
            null, null,null);

    if(cursor != null)
        cursor.moveToFirst();

    return new Note(cursor.getLong(0), cursor.getString(1), cursor.getString(2),
            cursor.getString(3),cursor.getString(4));
    }

public List<Note> getNotes() {
    SQLiteDatabase db = getReadableDatabase();
    List<Note> allNotes = new ArrayList<>();
    // Select * from databaseTable

    String query = "SELECT * FROM "+ DATABASE_TABLE;
    Cursor cursor = db.rawQuery(query,null);

    if(cursor.moveToFirst()){
        do{
            Note note = new Note();
            note.setID(cursor.getLong(0));
            note.setTitle(cursor.getString(1));
            note.setContent(cursor.getString(2));
            note.setDate(cursor.getString(3));
            note.setTime(cursor.getString(4));

            allNotes.add(note);

        }while(cursor.moveToNext());
    }
    return allNotes;
}

}
这是我的活动:

public class DetailActivity extends AppCompatActivity {

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

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    if (getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    Intent intent = getIntent();
    Long id = intent.getLongExtra("ID",0);

    NoteDataBase db = new NoteDataBase(this);
    Note note = db.getNote(id);
    Toast.makeText(this, "Title is "+ note.getTitle(), Toast.LENGTH_SHORT).show();

我的错误与我在detailactivity和notedatabase的getnote方法中的意图一致。

dxxyhpgq

dxxyhpgq1#

通过定义列 id 您的表的名称为:

INT PRIMARY KEY

它不被定义为 AUTOINCREMENT ,因此在添加到表中的每一行中 idnull ,因为你没有为它提供任何价值。
方法返回的值 addNote() ,插入新行时,是列的值 rowid 而不是列 id .
必须将列定义为:

INTEGER PRIMARY KEY

您还可以添加 AUTOINCREMENT 在上面的定义中,如果您不想重用任何已删除的id。
进行此更改后,必须从设备中卸载应用程序,以便删除数据库并重新运行以重新创建数据库和表。
在方法上也是如此 getNote() ,首先与 moveToFirst() 如果查询返回任何行:

public Note getNote(long ID){
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = db.query(DATABASE_TABLE,
            new String []{KEY_ID,KEY_TITLE,KEY_CONTENT,
            KEY_DATE,KEY_TIME},KEY_ID + "=?",
            new String[]{String.valueOf(ID)},
            null, null,null);

    if(cursor.moveToFirst())
        return new Note(
            cursor.getLong(0), cursor.getString(1), cursor.getString(2),
            cursor.getString(3),cursor.getString(4)
        );
    else return null;
}

相关问题