我如何获取最后的SQL ID?

时间:2019-05-02 20:31:10

标签: android

我想获取我的SQLite表的最后插入的ID,当我拥有此ID时,可以将其添加到命名约定中,以为jpg创建唯一的对应名称。

这是我创建图像的功能。

private String saveToInternalStorage(Bitmap bitmapImage){
        ContextWrapper cw = new ContextWrapper(getApplicationContext());
        // path to /data/data/yourapp/app_data/imageDir
        File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
        // Create imageDir
        int id = 999;
        id = helper.getID();
        File mypath=new File(directory,"Photo" + id +".jpg");

        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(mypath);
            // Use the compress method on the BitMap object to write image to the OutputStream
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return directory.getAbsolutePath();
    }

现在我想根据我的SQLite表的行来增加ID。因此,如果插入第7行,我想将照片命名为Photo7.jpg

这是我的datahelper类,在这里我将其称为插入:

package com.example.testapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

import static android.icu.text.MessagePattern.ArgType.SELECT;

public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String COL_1 = "Image";
    public static final String COL_2 = "Note";
    public static final String COL_3 = "Sort";
    public static final String COL_4 = "Weight";
    public static final String COL_5 = "Length";
    public static final String COL_6 = "Pond";

    public static final String Database = "Catch.db";
    public static final String Table = "CatchInformation";


    public DatabaseHelper(Context context){
        super(context, Database, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE "+ Table+ "(Id Integer PRIMARY KEY AUTOINCREMENT, IMAGE TEXT, NOTE TEXT, SORT TEXT, WEIGHT TEXT, LENGTH TEXT, POND TEXT)");
    }

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

    public boolean insertData(String image, String note, String sort, String weight, String length, String pond)throws SQLiteException{
        long result;

        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();

        contentValues.put(COL_1, image);
        contentValues.put(COL_2, note);
        contentValues.put(COL_3, sort);
        contentValues.put(COL_4, weight);
        contentValues.put(COL_5, length);
        contentValues.put(COL_6, pond);
        result = db.insert(Table, null, contentValues);

        if(result == -1)
            return false;
        else
            return true;
    }

    public int getID(){
        int receivedID = 0;

        receivedID = ???;
        return receivedID;
    }

}

我应该在“ ???”上填写什么

谢谢!

2 个答案:

答案 0 :(得分:0)

在您的SQLite代码中,应在查询插入行后立即使用以下SQL执行查询,查询应返回一个整数(可能是一个长整数),然后应将其作为返回值返回到您的getID方法。

select seq from sqlite_sequence where name="table_name"

答案 1 :(得分:0)

您可以使用SQL内置函数LAST_INSERT_ROWID()检索最后插入的自动递增的ID。

  

sqlite3_last_insert_rowid(D)接口通常将最近成功执行INSERT的rowid返回到数据库连接D上的rowid表或虚拟表中。不记录在WITHOUT ROWID表中的插入。如果在数据库连接D上没有成功向rowid表插入INSERT,则sqlite3_last_insert_rowid(D)返回零。

您可以阅读有关此功能的更多信息here.,也可以阅读this as well.

具有以下功能的示例查询:"SELECT LAST_INSERT_ROWID()"

此查询的替代方法是比较数据库中的所有ID,并返回其中最大的ID。

查询示例:"SELECT * FROM your_table WHERE yourColumn = (SELECT MAX(yourID) FROM your_table)"

请记住,以上查询只是为了提出可能的解决方案