记录自己踩过的坑 编译失败 以及Room数据库的使用

1.在编译项目的时候出现不能编译 出错的问题

compiler message file broken: key=compiler.misc.msg.bug arguments=11.0.8, {1}, {2}, {3}, {4}, {5}, {6}, {7}
java.lang.NullPointerException
	at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply(Flow.java:1235)
	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1634)
	at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:398)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitReturn(Flow.java:1210)
	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1546)
	at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:398)
	at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitBlock(Flow.java:997)
	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1020)
	at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:398)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitMethodDef(Flow.java:964)
	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:866)
	at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:398)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitClassDef(Flow.java:927)
	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:774)
	at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:398)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1327)
	at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1317)
	at jdk.compiler/com.sun.tools.javac.comp.Flow.analyzeTree(Flow.java:218)
	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1401)
	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1375)
	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:147)
	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
	at org.gradle.internal.compiler.java.IncrementalCompileTask.call(IncrementalCompileTask.java:74)
	at org.gradle.api.internal.tasks.compile.AnnotationProcessingCompileTask.call(AnnotationProcessingCompileTask.java:94)
	at org.gradle.api.internal.tasks.compile.ResourceCleaningCompilationTask.call(ResourceCleaningCompilationTask.java:57)
	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:55)
	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:40)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:97)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:51)
	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37)
	at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:51)
	at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:37)
	at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:46)
	at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:36)
	at org.gradle.api.internal.tasks.compile.CleaningJavaCompiler.execute(CleaningJavaCompiler.java:53)
	at org.gradle.api.internal.tasks.compile.incremental.IncrementalCompilerFactory.lambda$createRebuildAllCompiler$0(IncrementalCompilerFactory.java:98)
	at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:61)
	at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:45)
	at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:59)
	at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:51)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
	at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler.execute(CompileJavaBuildOperationReportingCompiler.java:51)
	at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:343)
	at org.gradle.api.tasks.compile.JavaCompile.performIncrementalCompilation(JavaCompile.java:237)
	at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:209)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
	at org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction.doExecute(IncrementalInputsTaskAction.java:32)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
	at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:555)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:540)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:523)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:260)
	at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$0(ExecuteStep.java:33)
	at java.base/java.util.Optional.map(Optional.java:265)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:42)
	at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
	at java.base/java.util.Optional.map(Optional.java:265)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
	at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:187)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:179)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:834)

> Task :app:compileDebugJavaWithJavac FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

莫名其妙的出现 然后通过询问各种大佬 发现是JDK出现的问题
在这里插入图片描述
这里引用了AS自带的JDK 出现了这个问题,也有大佬说 用了java11会出现,还说也有可能是注解引起的,大佬说上次出现这个类似的问题是用了java11.0.2
然后我换了一下JDK的路径 换成了我自己安装的配置过环境变量的那个问题解决了
在这里插入图片描述

2.Android Room 数据库的坑

在用Room数据库的时候 发现有需要一个字段的条件合到一起去写这个SQL

 @Query("SELECT * FROM 表名 WHERE 字段A = '1' and 字段B <= :Time " +
            "and 字段B >= :Time and 字段C <= :BTime and 字段C >= :BTime " +
            "and '(' || 字段D is null or 字段D = '' || ')'")
    List selectList(String Time, String BTime);

这里面的 “ ||” 是Room里面独特的表达方式 是替代了java里面的“+”号

正常在android中 使用 是这样的

String sql = "SELECT * FROM doorstrategy WHERE 字段A = '1' and 字段B <= "+传入的参数+" " +
            "and 字段B >= "+传入的参数+" and 字段C <= "+传入的参数+" and 字段c >= "+传入的参数+" " +
            "and '(' "+" 字段D is null or 字段D = '' "+" ')'"


cursor = db.rawQuery(sql, null);

而在Room 中 用 “||” 代替了 “+”

3.Android Room 查询语句的坑

@Query("SELECT * FROM 表名 WHERE 字段A = '0' order by id desc")
List selectList();

假如你正在查询一张表的面的内容,然后忽然跑出来一个异常


# [Android RoomDatabase Cruash "Cursor window allocation of 4194304 bytes failed"](https://stackoverflow.com/questions/75456123/android-roomdatabase-cruash-cursor-window-allocation-of-4194304-bytes-failed)

奔溃日志:

android.database.CursorWindowAllocationException: Could not allocate CursorWindow '/data/user/0/cn.xxx.xxx/databases/xxx.db' of size 2097152 due to error -13.
	at android.database.CursorWindow.nativeCreate(Native Method)
	at android.database.CursorWindow.<init>(CursorWindow.java:139)
	at android.database.CursorWindow.<init>(CursorWindow.java:120)
	at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:202)
	at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:147)
	at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:140)
	at yd.d.m(SourceFile:21)
	at cn.xxx.control.y.y0(SourceFile:1)
	at e5.y.p(SourceFile:230)
	at e5.y.l(SourceFile:1)
	at e5.y.E(SourceFile:1)
	at cn.xxx.cluster.classin.viewmodel.SessionViewModel$d.invokeSuspend(SourceFile:42)

触发原因

  • Room 对应的 Sqlite 数据库,其对 CursorWindows 分配的大小是有限制的,最大为 2M,超过之后会发生上述崩溃闪退现象(偶现且难以复现的 bug

解决方法

需要业务方梳理这块的业务,优化数据库的调用,如果明确知道在一个方法里面会调用多个数据库的方法,需要让 controller 提供新的方法,且这个 controller 层的方法需要添加 @Transaction 进行注解,从而保证在同一个事物内进行数据库操作,以此避免 CursorWindows 大小超过 2M

那么问题来了 @Transaction 这个注解是干嘛的呢

翻译 事务的意思

@Transaction
@Query("SELECT * FROM 表名 WHERE 字段A = '0' order by id desc")
List selectList();

接着 问题完美解决

大家学费了嘛 学费的评论区Q1 没学费的抠眼珠子

我是一个java初学者 我让我的deepseek给我安排了一个完成项目的日志以下是针对你的一周高效学习与开发方案,每天聚焦核心任务,确保完成基础功能: --- ### **整体策略** 1. **优先级排序**:先完成客户端、商户端、管理端的**核心功能**(必须完成项),再考虑进阶功能。 2. **简化前端展示**:使用**控制台输入输出**或**HTML+JS纯原生前端**(无需复杂框架),减少学习成本。 3. **模块化开发**:严格遵循MVC分层(Servlet→Service→DAO),边学边实现。 --- ### **每日计划(总计约40小时)** #### **Day 1:搭建基础环境 + 数据库设计(4小时)** 1. **环境配置(1小时)** - 安装JDK11、IDEA、MySQL、Navicat/SQLyog。 - 创建Gitee仓库,初始化项目结构(按分包要求)。 2. **数据库设计(3小时)** - 分析需求,设计表结构(至少包含以下表): - **用户表**(用户ID、账号、密码、钱包余额、角色[客户/商户/管理员]) - **店铺表**(店铺ID、名称、地址、状态[营业中/封禁]、审核状态) - **房型表**(房型ID、店铺ID、床型、剩余数量、价格、关键词) - **订单表**(订单ID、用户ID、房型ID、状态[已预订/已取消]、金额、时间) - 使用Navicat建表,并生成SQL脚本提交到仓库。 --- #### **Day 2:JDBC工具类封装 + 用户登录注册(4小时)** 1. **学习JDBC核心(2小时)** - 掌握`Connection`、`PreparedStatement`、`ResultSet`的使用。 - 封装`JDBCUtils`工具类(连接池、关闭资源)。 2. **实现用户模块(2小时)** - 编写`UserDao`:实现用户注册、登录(密码明文存储即可)。 - 编写`UserServlet`:处理注册/登录请求(通过控制台或HTML表单输入)。 - **测试**:通过控制台输入账号密码验证登录逻辑。 --- #### **Day 3:客户端核心功能(4小时)** 1. **用户功能(2小时)** - 实现**修改个人信息**、**充值钱包**(更新用户表余额)。 - 编写`UserService`处理业务逻辑(如充值金额校验)。 2. **店铺浏览与排序(2小时)** - 编写`ShopDao`:查询所有店铺(按销量、发布时间排序)。 - 在`ShopServlet`中返回店铺列表(控制台打印或HTML表格展示)。 --- #### **Day 4:商户端核心功能(4小时)** 1. **商户入驻与审核(2小时)** - 编写`ShopDao`:商户注册(插入店铺表,状态为“待审核”)。 - 编写`AdminServlet`:管理员审核店铺(更新店铺状态)。 2. **房型管理(2小时)** - 商户登录后,实现**添加房型**、**修改房型信息**(操作房型表)。 - 编写`RoomDao`和`RoomServlet`处理请求。 --- #### **Day 5:订单模块 + 退订(4小时)** 1. **订房功能(2小时)** - 编写`OrderDao`:插入订单记录,减少房型剩余数量。 - 实现**订房**逻辑(检查房型余量、更新钱包余额)。 2. **退订功能(2小时)** - 编写`OrderDao`:更新订单状态为“已取消”,返还房型余量。 - 处理退订时的金额返还逻辑(需事务控制)。 --- #### **Day 6(周末):管理端 + 联调测试(10小时)** 1. **管理端功能(4小时)** - 实现管理员**封禁店铺**、**审核充值**(需新增充值审核表)。 - 编写`AdminServlet`处理审核逻辑。 2. **联调与测试(6小时)** - 通过控制台或简单HTML页面模拟用户、商户、管理员操作。 - 重点测试:订单状态流转、余额变动、审核流程。 - 修复BUG,确保核心流程跑通。 --- #### **Day 7(周末):日志整理 + 代码优化(10小时)** 1. **代码规范(4小时)** - 安装阿里巴巴插件,修复所有警告(如命名规范、分层问题)。 - 抽离冗余代码为工具类(如日期格式化、金额校验)。 2. **提交与文档(6小时)** - 编写项目README.md(说明功能、数据库设计、运行方式)。 - 提交完整代码到Gitee,确保分支清晰、提交记录有意义。 - 整理每日日志(记录学习内容和开发进度)。 --- ### **关键学习资源推荐** 1. **JDBC入门**:B站黑马程序员《JDBC从入门到精通》(2小时速通)。 2. **Servlet基础**:菜鸟教程Servlet快速入门(1小时掌握请求响应流程)。 3. **原生前端交互**:使用`fetch API`或`XMLHttpRequest`实现前后端通信(MDN文档)。 --- ### **注意事项** 1. **严格分层**:Servlet只负责接收请求和返回结果,业务逻辑交给Service层。 2. **事务控制**:在JDBC中手动管理事务(如订单创建时开启事务,确保余额和房型同步更新)。 3. **简单前端**:用HTML表单+JS发送请求,避免复杂框架(例如用`<form action="/login" method="post">`)。 --- 按此计划执行,你可以在7天内完成核心功能并通过考核!遇到问题优先查阅官方文档,必要时再向师兄师姐提问。加油! 我现在完成了第一步 已经在workbench中创建了users shop room oders 请告诉我下一步
03-29
<think>嗯,用户已经完成了第一天的任务,也就是环境搭建和数据库设计,现在在Workbench中创建了users、shop、room、orders这几个表。接下来用户需要知道下一步该做什么,也就是第二天的任务:JDBC工具类封装和用户登录注册功能。 首先,我需要确认用户是否清楚第二天的任务目标。根据用户提供的计划,Day 2的重点是学习JDBC核心知识,封装工具类,并实现用户模块的注册和登录功能。用户可能作为Java初学者,对JDBC的使用还不熟悉,特别是工具类的封装,以及如何将数据库操作整合到DAO层。 接下来,我需要分步骤解释如何完成这些任务。第一步是学习JDBC的核心类,比如Connection、PreparedStatement和ResultSet,这些是操作数据库的基础。用户可能需要了解如何获取数据库连接,执行SQL语句,处理结果集,以及关闭资源以避免内存泄漏。 然后,封装JDBCUtils工具类是关键。这里需要说明为什么要使用连接池,可能用户还不明白连接池的作用,需要简单解释连接池可以提升性能,避免频繁创建和关闭连接。同时,工具类需要处理连接的获取和资源的释放,确保代码的简洁和可维护性。 接下来是实现UserDao,用户需要编写注册和登录的数据库操作方法。这里需要注意使用PreparedStatement来防止SQL注入,以及如何将结果集转换为User对象。密码存储部分,用户可能对加密有疑问,但根据计划,目前只需明文存储,所以暂时不需要处理加密,但可能需要提醒未来需要改进。 然后是UserServlet部分,用户需要处理HTTP请求,获取参数,调用Service层,然后返回响应。这里可能需要解释Servlet的基本结构,doPost和doGet方法的使用,以及如何将结果返回给前端,无论是控制台还是简单的HTML页面。 测试部分,用户需要确保注册和登录功能正常,可能需要指导如何通过控制台输入或表单提交测试,以及如何检查数据库中的数据是否正确写入。 可能遇到的问题包括数据库连接失败,SQL语句错误,空指针异常等。需要提醒用户检查数据库配置,如URL、用户名、密码是否正确,以及JDBC驱动是否正确加载。另外,事务处理可能在后续的订单功能中更重要,但第二天可能暂时不需要,但可以提及。 用户可能需要代码示例来理解如何具体实现,因此提供简单的代码框架会有帮助,同时强调代码结构和分层的重要性,比如严格遵循MVC,Servlet不处理业务逻辑,只负责请求和响应。 最后,确保用户理解接下来的步骤,并鼓励他们在遇到问题时查阅推荐的学习资源,如B站的黑马程序员教程,或者菜鸟教程的Servlet部分。同时提醒他们注意代码规范,为后续的优化和调试做好准备。</think>根据你的进度,下一步应进入**Day 2的任务:封装JDBC工具类 + 实现用户登录注册功能**。以下是具体操作步骤: --- ### **Step 1:学习JDBC核心操作(2小时)** #### 重点掌握三个核心类: 1. **`Connection`**:数据库连接对象 ```java Connection conn = DriverManager.getConnection(url, username, password); ``` 2. **`PreparedStatement`**:预编译SQL语句(防SQL注入) ```java String sql = "SELECT * FROM users WHERE account = ? AND password = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, "user123"); // 替换第一个问号 ps.setString(2, "123456"); // 替换第二个问号 ``` 3. **`ResultSet`**:接收查询结果 ```java ResultSet rs = ps.executeQuery(); if (rs.next()) { String username = rs.getString("username"); } ``` --- ### **Step 2:封装JDBCUtils工具类(关键!)** #### 创建`JDBCUtils.java`,实现以下功能: ```java public class JDBCUtils { // 1. 静态加载数据库配置(建议用properties文件) private static String url = "jdbc:mysql://localhost:3306/你的数据库名?useSSL=false"; private static String user = "root"; private static String password = "你的密码"; // 2. 获取连接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } // 3. 关闭资源(重载方法) public static void close(Connection conn, PreparedStatement ps, ResultSet rs) { try { if (rs != null) rs.close(); if (ps != null) ps.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` --- ### **Step 3:实现UserDao(数据访问层)** #### 创建`UserDao.java`,实现注册和登录: ```java public class UserDao { // 用户注册 public boolean register(User user) { String sql = "INSERT INTO users (account, password, role) VALUES (?, ?, ?)"; try (Connection conn = JDBCUtils.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, user.getAccount()); ps.setString(2, user.getPassword()); ps.setString(3, user.getRole()); return ps.executeUpdate() > 0; } catch (SQLException e) { e.printStackTrace(); return false; } } // 用户登录 public User login(String account, String password) { String sql = "SELECT * FROM users WHERE account = ? AND password = ?"; try (Connection conn = JDBCUtils.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, account); ps.setString(2, password); ResultSet rs = ps.executeQuery(); if (rs.next()) { User user = new User(); user.setId(rs.getInt("user_id")); user.setAccount(rs.getString("account")); user.setRole(rs.getString("role")); return user; } } catch (SQLException e) { e.printStackTrace(); } return null; } } ``` --- ### **Step 4:编写UserServlet(控制层)** #### 创建`UserServlet.java`,处理HTTP请求: ```java @WebServlet("/user/*") public class UserServlet extends HttpServlet { private UserDao userDao = new UserDao(); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String path = req.getRequestURI(); if (path.contains("/register")) { // 获取表单参数 String account = req.getParameter("account"); String password = req.getParameter("password"); String role = req.getParameter("role"); // 客户/商户/管理员 User user = new User(account, password, role); boolean success = userDao.register(user); resp.getWriter().write(success ? "注册成功" : "注册失败"); } else if (path.contains("/login")) { // 类似处理登录逻辑 } } } ``` --- ### **Step 5:测试验证** #### 通过HTML表单或控制台输入测试: 1. **注册测试**:访问`http://localhost:8080/你的项目名/register.html`提交表单 ```html <form action="/user/register" method="post"> 账号:<input type="text" name="account"><br> 密码:<input type="password" name="password"><br> 角色:<select name="role"> <option value="客户">客户</option> <option value="商户">商户</option> </select><br> <button type="submit">注册</button> </form> ``` 2. **登录测试**:检查数据库`users`表是否有新数据插入 --- ### 常见问题排查 1. **数据库连接失败**:检查MySQL服务是否启动,url中的数据库名是否正确 2. **SQL语句错误**:在Workbench中直接运行SQL验证语法 3. **空指针异常**:确保`User`类有默认构造函数和getter/setter --- 完成以上步骤后,你将实现用户系统的核心功能!下一步可进入Day 3的客户端功能开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值