【问题标题】:Pass data to another class将数据传递给另一个类
【发布时间】:2015-10-02 05:07:58
【问题描述】:

我有两张桌子,一张是Information,另一张是WorkDetailsTable。根据意图,活动流为Information.java>>WorkDetailsTable.java。当Information.java中的button被点击时,会保存所有数据并传递给WorkDetails.java

Information.java

 Button button=(Button)findViewById(R.id.button5);

       button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                Intent intent = new Intent(context, WorkDetailsTable.class);
                intent.putExtra("a",a);
                intent.putExtra("b",b);
                intent.putExtra("date1",date1);
                intent.putExtra("c",c);

                startActivity(intent);
            }
        });

工作详情表

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final String name=getIntent().getExtras().getString("a"); // data get from Information.java
final String weather=getIntent().getExtras().getString("b");
final String date=getIntent().getExtras().getString("date1");
final String status=getIntent().getExtras().getString("c");
ts= new com.example.project.project.API.InfoAPI(this);
WD= new com.example.project.project.API.WorkDetailsAPI(this);
Button btn1=(Button)findViewById(R.id.button2);
       btn1.setOnClickListener(new View.OnClickListener() {
             public void onClick(View arg0) {
                    W1=txtWork1.getText().toString();
                    W2=txtWork2.getText().toString();
                    W3=txtWork3.getText().toString();
                    W4=txtWork4.getText().toString();
                    P1=per1.getText().toString();
                    P2=per2.getText().toString();
                    P3=per3.getText().toString();
                    P4=per4.getText().toString();
                    ts.insertTimeSheet(name,weather,date,status); 
//insert multiple row to Work Details table, Id auto increment but foreign key remains the same
                    WD.insertWorkDetails(a1,W1,P1,b,c,th);
                    WD.insertWorkDetails(a2,W2,P2,d,e1,th);
                    WD.insertWorkDetails(a3, W3, P3, f, g,th);
                    WD.insertWorkDetails(a4,W4,P4,h,i,th);
                }
            });
        }

InfoAPI.java

public String[] allColumns={MyDatabaseHelper.ID,MyDatabaseHelper.Name,MyDatabaseHelper.Weather,MyDatabaseHelper.Date,MyDatabaseHelper.Status};
 public long insertTimeSheet(String name,String weather,String date,String status)
    {
        database=dbHelper.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(MyDatabaseHelper.Name,name);
        values.put(MyDatabaseHelper.Weather,weather);
        values.put(MyDatabaseHelper.Date,date);
        values.put(MyDatabaseHelper.Status,status);
        database.insert(MyDatabaseHelper.TABLE_INFO,null,values);
        database.close();
        return 0 ;

    }

WorkDetailsAPI.java

     public String[] allColumns={MyDatabaseHelper.ID2,MyDatabaseHelper.Project,MyDatabaseHelper.WorkDescription,MyDatabaseHelper.Per,MyDatabaseHelper.TimeIn,MyDatabaseHelper.TimeOut,MyDatabaseHelper.TotalHours,MyDatabaseHelper.TableInfo_id};
 public long insertWorkDetails(String project, String workDescription, String per,String timeIn,String timeOut,String totalHours)
    {
        database=dbHelper.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(MyDatabaseHelper.Project,project);
        values.put(MyDatabaseHelper.WorkDescription,workDescription);
        values.put(MyDatabaseHelper.Per,per);
        values.put(MyDatabaseHelper.TimeIn,timeIn);
        values.put(MyDatabaseHelper.TimeOut,timeOut);
        values.put(MyDatabaseHelper.TotalHours,totalHours);
        database.insert(MyDatabaseHelper.TABLE_WORKDETAILS,null,values);
        database.close();
        return 0 ;

    }

MyDatabaseHelper.java

 public void onCreate(SQLiteDatabase db)
    {
        db.execSQL("create table "+TABLE_INFO+"(ID INTEGER PRIMARY KEY ,Name TEXT,Weather TEXT, Date DATETIME, Status Text)");
        db.execSQL("create table"+TABLE_WORKDETAILS+"(ID INTEGER PRIMARY KEY , Project TEXT, WorkDescription TEXT, Per Text, TimeIn DATETIME, TimeOut DATETIME,TotalHours DATETIME, TableInfo_id INTEGER, FOREIGN KEY(TableInfo_id)REFERENCES TABLE_INFO(ID)");
    }

为了让我的问题更容易理解,我总结如下:

1. Is this the correct way to pass the data to another class and save them to different table ?
2. How to insert a foreign key into another table? 

我问了一个与我的问题相关的类似问题。请参考Inserting a foreign key into a table

当我运行我的项目时,它会出现错误。

10-02 04:56:29.104    5016-5030/com.example.project.project E/Surface﹕ getSlotFromBufferLocked: unknown buffer: 0xb4057be0
10-02 04:56:29.107    5016-5030/com.example.project.project D/OpenGLRenderer﹕ endAllStagingAnimators on 0xa2d54000 (RippleDrawable) with handle 0xabe46820
10-02 04:56:34.936    5016-5016/com.example.project.project E/SQLiteLog﹕ (1) near "tableWork": syntax error
10-02 04:56:34.974    5016-5016/com.example.project.project D/AndroidRuntime﹕ Shutting down VM
10-02 04:56:34.974    5016-5016/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.project.project, PID: 5016
    android.database.sqlite.SQLiteException: near "tableWork": syntax error (code 1): , while compiling: create tableWork Details(ID INTEGER PRIMARY KEY , Project TEXT, WorkDescription TEXT, Per Text, TimeIn DATETIME, TimeOut DATETIME,TotalHours DATETIME, TableInfo_id INTEGER, FOREIGN KEY(TableInfo_id)REFERENCES TABLE_INFO(ID)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)

【问题讨论】:

  • 你的 sql 语法错误,检查一下,可能会解决....
  • 你的错误日志它自己代表你的代码问题在哪里,所以总是尝试从错误日志中找出问题,并在你的项目上写完后尝试测试对数据库管理器工具的任何数据库查询。
  • 注意,谢谢:)

标签: java android sqlite foreign-keys


【解决方案1】:

问题出在您的第二个创建查询中。

db.execSQL("create table"+TABLE_WORKDETAILS+"(ID INTEGER PRIMARY KEY , Project TEXT, WorkDescription TEXT, Per Text, TimeIn DATETIME, TimeOut DATETIME,TotalHours DATETIME, TableInfo_id INTEGER, FOREIGN KEY(TableInfo_id)REFERENCES TABLE_INFO(ID )");

您的日志显示这是执行的查询:

android.database.sqlite.SQLiteException: near "tableWork": syntax error (code 1): , while compile: create tableWork Details(ID INTEGER PRIMARY KEY, Project TEXT, WorkDescription TEXT, Per Text, TimeIn DATETIME, TimeOut DATETIME ,TotalHours DATETIME, TableInfo_id INTEGER, FOREIGN KEY(TableInfo_id)REFERENCES TABLE_INFO(ID)

首先,您错过了表格后面的空格。其次,您的常量TABLE_WORKDETAILS 值为Work Details。表名不能有空格,所以改成Work_Details。您还应该在FOREIGN KEY(TableInfo_id) 之后留出空格。

应该是这样的:

 db.execSQL("create table "+TABLE_WORKDETAILS+"(ID INTEGER PRIMARY KEY , Project TEXT, WorkDescription TEXT, Per Text, TimeIn DATETIME, TimeOut DATETIME,TotalHours DATETIME, TableInfo_id INTEGER, FOREIGN KEY(TableInfo_id) REFERENCES "+TABLE_INFO+"(ID))");

【讨论】:

  • 为什么我在 WorkDetails 表中得到 NULL 值?
【解决方案2】:

你得到的错误是因为你使用的SQL语句不正确:

db.execSQL("create table"+TABLE_WORKDETAILS+"(ID INTEGER PRIMARY KEY , Project TEXT, WorkDescription TEXT, Per Text, TimeIn DATETIME, TimeOut DATETIME,TotalHours DATETIME, TableInfo_id INTEGER, FOREIGN KEY(TableInfo_id)REFERENCES TABLE_INFO(ID)");

table这个词后面你少了一个空格,你在句尾也少了一个括号。

应该是这样的:

db.execSQL("create table "+TABLE_WORKDETAILS+"(ID INTEGER PRIMARY KEY , Project TEXT, WorkDescription TEXT, Per Text, TimeIn DATETIME, TimeOut DATETIME,TotalHours DATETIME, TableInfo_id INTEGER, FOREIGN KEY(TableInfo_id)REFERENCES TABLE_INFO(ID))");

我认为外键语法是正确的,但请注意默认情况下禁用外键限制,如果要启用它们必须使用PRAGMA foreign_keys = ON 语句。

最后你的变量TABLE_WORKDETAILS 应该没有空格,因为表名不能有空格,所以把它改成Work_Details 希望对你有帮助

【讨论】:

  • 应该把'PRAGMA foreign_keys = ON'语句放在哪里?信息表中有 1 个 ID,但在我的 WorkDetails 表中,我的 FK 列中为 NULL
【解决方案3】:

为避免此类耗时且容易出错的低级 sql 问题,您可以考虑使用 sql-lite ORM(对象关系映射)库,该库处理对象的持久性(以及因此创建 sql 语句)给你。

要获得概览,请查看hereherehere

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多