迁移房间数据库时有没有办法使用迁移期间计算的变量?

如何解决迁移房间数据库时有没有办法使用迁移期间计算的变量?

我正在用 Java 编写一个 Android 应用程序,我已经更改了我的数据库,现在我想将其迁移到新版本,但为此我需要计算一些旧值,然后将它们插入其中一个新表进入数据库但是当我打电话

import Photos
import PhotosUI

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        if #available(iOS 14,*) {
            let accessLevel: PHAccessLevel = .readWrite
            let authorizationStatus  = PHPhotoLibrary.authorizationStatus(for: accessLevel)
            switch authorizationStatus {
            case .limited:
                var testVc = UIViewController()
                PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: testVc)
                //callBack(authorizationStatusAuthorised)
            case .authorized:
                //callBack(authorizationStatusAuthorised)
                var te = ""
            default:
                //callBack("")
                var test = ""
            }
        }
    }
}

使用我的变量然后访问它们似乎没有将它们设置为每个值都是 0。

这是不可能的还是我只是错过了什么?

database.execSQL()

当我查看存储在 springValues 中的值时,即使我在此查询中添加了正确的值,它们也都是 0

public void migrate(@NonNull SupportSQLiteDatabase database) {
             database.execSQL("CREATE TABLE 'season' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,'spring' INTEGER DEFAULT 0,'summer' INTEGER DEFAULT 0,'autumn' INTEGER 
                    DEFAULT 0,'winter' 
                    INTEGER DEFAULT 0,'spook' INTEGER DEFAULT 0)");
            database.execSQL("INSERT INTO 'Clothes' (type_of_clothing,clothing_name,description,seasonId,in_laundry,TypeList) " +
                    "SELECT type_of_clothing,type_of_clothing,TypeList " +
                    "FROM ClothesNew");
            Cursor cursor = database.query("SELECT * FROM Clothes");
            Cursor secondCursor = database.query("SELECT * FROM ClothesSeason");
            ArrayList<Season> seasonsToBeAdded = new ArrayList<>();
            while (cursor.moveToNext()) {
                secondCursor.moveToNext();
                int Sid = cursor.getInt(0);
                String seasonString = secondCursor.getString(2);
                Season season = new Season(seasonString);
                int tempId = Sid;
                boolean isInList = false;
                for (Season tempSeason : seasonsToBeAdded) {
                    if (tempSeason.equals(season)) {
                        tempId = seasonsToBeAdded.indexOf(tempSeason);
                        isInList = true;
                        break;
                    }
                }
                if (!isInList) {
                    season.setId(seasonsToBeAdded.size());
                    tempId = season.getId();
                    seasonsToBeAdded.add(season);
                }
                if (seasonsToBeAdded.size() == 0) {seasonsToBeAdded.add(season);}
                
                database.execSQL("UPDATE Clothes SET seasonId = :tempId WHERE uid = :Sid");
            }

            int id,spring,summer,autumn,winter,spook;

            for (Season season : seasonsToBeAdded) {
                id = season.getId();
                spring = season.getSpring();
                summer = season.getSummer();
                autumn = season.getAutumn();
                winter = season.getWinter();
                spook = season.getSpook();
                database.execSQL("INSERT INTO season " +
                        "VALUES(:id,:spring,:summer,:autumn,:winter,:spook) ");
            }
            Cursor otherCursor = database.query("SELECT * FROM season");
            ArrayList<Integer> springValues= new ArrayList<>();
            while (otherCursor.moveToNext()) {
                springValues.add(otherCursor.getInt(1));
            }
        }

我可以不在这里使用 :var 符号吗?

解决方法

我建议将 SQLiteDatabase Insert 便捷方法与 ContentValues 对象一起使用。

而不是:-

        for (Season season : seasonsToBeAdded) {
            id = season.getId();
            spring = season.getSpring();
            summer = season.getSummer();
            autumn = season.getAutumn();
            winter = season.getWinter();
            spook = season.getSpook();
            database.execSQL("INSERT INTO season " +
                    "VALUES(:id,:spring,:summer,:autumn,:winter,:spook) ");
        }

你的代码可能是:-

    ContentValues cv = new ContentValues(); // Instantiate ContentValues object
    for (Season season : seasonsToBeAdded) {
        cv.clear();
        cv.put("`id`",season.getId());
        cv.put("`spring`",season.getSpring());
        cv.put("`summer`",season.getSummer());
        cv.put("`autumn`",season.getAutumn());
        cv.put("`winter`",season.getWinter());
        cv.put("`spook`",season.getSpook());
        database.insert("season",null,cv); //<<<< Recommended Uses the convenience Insert Method
  • 请注意,不需要将列名括在上面使用的重音符`` 中。

  • 以上代码为原理性代码,未经测试,可能存在一些错误。

如您所见,SQL 是为您构建的。 insert 方法返回插入行的 rowid(id 列)或 -1 如果插入失败,您可能希望利用此值。

您可能还希望使用其他插入方法,例如insertWithOnConflict 例如database.insertWithOnConflict("season",cv,SQLiteDatabase.CONFLICT_IGNORE);

还建议通过使用适当的 SQLiteDatabase 事务处理方法来利用事务(请参阅 beginTransaction

它还建议您对列名使用常量,以便将名称编码到位。把列名弄错的可能性很小。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?