android db2,使用JDBC将Android应用程序连接到Bluemix db2数据库(NoClassDefFoundError :)

第一:我有一些Java经验但是我第一次创建Android-App . 我正在使用Bluemix IoT-Foundation-Service并获得了一个Bluemix-DB2-SQL数据库 . (我的RasPi2正在收集一些传感器数据,通过MQTT发布它们,以及在订阅此数据的bluemix上运行的应用程序,将它们存储到DB2数据库中) .

现在我想编写一个Android应用程序,它连接到我的数据库并做一些数据库事务 . 我从一个简单的应用程序开始 . 只是一个在我的DB2-TodoList-Table上添加内容的按钮 .

码:

import android.os.Bundle;

import android.support.design.widget.FloatingActionButton;

import android.support.design.widget.Snackbar;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.Toolbar;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import java.sql.*;

public class MainActivity extends AppCompatActivity {

static Connection con;

static Statement stmt;

static Statement stmt1;

static DatabaseMetaData dmd;

private static String user = "user*****";

private static String password = "L***********";

private static String url = "jdbc:db2://*.**.*****:50001/SQLDB";

public void connect(){

java.util.Properties properties = new java.util.Properties();

properties.put("user", user);

properties.put("password", password);

properties.put("sslConnection", "true");

try {

Class.forName("com.ibm.db2.jcc.DB2Driver");

con = DriverManager.getConnection(url, properties);

stmt = con.createStatement();

} catch (ClassNotFoundException e) {

// e.printStackTrace();

} catch (SQLException e) {

// e.printStackTrace();

}

}

public void close() throws SQLException, ClassNotFoundException{

stmt.close();

con.close();

}

public static void addSomethingToMyToDoList(int ID, String something) throws SQLException{

if(con != null)

stmt.executeUpdate("INSERT INTO TODOLIST VALUES (" + ID + " , '" + something +"')");

con.commit();

}

public void addSomethingToDatabase(View v){

connect();

int sampleID = 1233;

try {

addSomethingToMyToDoList(sampleID, "testTest");

close();

} catch (SQLException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

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

setSupportActionBar(toolbar);

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

fab.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)

.setAction("Action", null).show();

}

});

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.menu_main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId();

//noinspection SimplifiableIfStatement

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

}

我将db2jcc.jar拖放到/ app / libs文件夹中,然后右键单击Add as library

我使用Android Studio

我已经读过db2jcc.jar不能用于jdk 1.8这就是为什么我安装了jdk 1.7(文件 - >项目结构 - > SDK位置 - >将JDK位置改为我的jdk1.7.0目录)

build.gradle文件包含:

defaultConfig {

[...]

multiDexEnabled true

}

dependencies {

compile fileTree(include: ['*.jar'], dir: 'libs')

compile files('libs/db2jcc.jar')

testCompile 'junit:junit:4.12'

compile 'com.android.support:design:23.1.1'

compile 'com.android.support:multidex:1.0.1'

compile 'com.android.support:appcompat-v7:23.1.1'

}

当我运行我的应用程序(在AVD上)并单击按钮时,我的应用程序崩溃,我收到此消息:

Caused by: java.lang.NoClassDefFoundError: com.ibm.db2.jcc.DB2SimpleDataSource

完整错误日志:

FATAL EXCEPTION:main进程:com.example.egebert.datanbank,PID:7125 java.lang.IllegalStateException:无法执行android的方法:onClick at android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java :275)在android.view.View.performClick(View.java:5198)android.view.View $ PerformClick.run(View.java:21147)android.os.Handler.handleCallback(Handler.java:739)在android.os.Handler.dispatchMessage(Handler.java:95)的android.app.Looper.loop(Looper.java:148)在android.app.ActivityThread.main(ActivityThread.java:5417)的java.lang上 . 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)中的reflect.Method.invoke(Native Method) :java.lang.reflect.Method.invoke(Native Method)的java.lang.reflect.InvocationTargetException,位于android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)at android.view.View.performClick(View.java:5198)在android.view.View $ PerformClick.run(View.java:21147)android.os.Handler.handleCallback(Handler.java:739)android.os .Handler.dispatchMessage(Handler.java:95)位于android.app.Looper.loop(Looper.java:148)的android.app.ActivityThread.main(ActivityThread.java:5417),位于java.lang.reflect.Method . com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)中调用(Native Method)引起:java . lang.NoClassDefFoundError:com.ibm.db2.jcc.DB2SimpleDataSource,java.lang.Class.classForName(Native Method),位于java.lang.Class.forName(Class.java:324),位于java.lang.Class.forName(Class .java:285)com.ibm.db2.jcc.am.GlobalProperties.d(未知来源)位于com.ibm.db2.jcc的com.ibm.db2.jcc.am.GlobalProperties.a(未知来源) . 来自com.ibm.db2.jcc.am.hb.j(未知来源)的com.ibm.db2.jcc.am.GlobalProperties.a(未知来源)的am.GlobalProperties.c(未知来源)位于java.lang.Class的java.lang.Class.forName(Class.java:324)的java.lang.Class.classForName(Native Method)中的om.ibm.db2.jcc.am.hb.(未知来源) . forName(Class.java:285)at com.ibm.db2.jcc.DB2BaseDataSource.class $(Unknown Source)at com.ibm.db2.jcc.DB2BaseDataSource . (Unknown Source)at java.lang.Class.classForName(Native方法)at java.lang.Class.forName(Class.java:324)at java.lang.Class.forName(Class.java:285)at com.ibm.db2.jcc.DB2Driver.class $(Unknown Source)at at com.ibm.db2.jcc.DB2Driver . (未知来源)位于java.lang.Class.forName(Class.java:324)的java.lang.Class.classForName(Native Method)中的java.lang.Class.forName( Class.java:285)at com.example.egebert.datanbank.MainActivity.connect(MainActivity.java:40)at com.example.egebert.datanbank.MainActivity.addSomethingToDatabase(MainActivity.java:78)at java.lang.reflect .Method.invoke(Native Method)在android.view.View.p上的android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) erformClick(View.java:5198)在android.view.Handler.dispatchMessage上的android.view.View $ PerformClick.run(View.java:21147)android.os.Handler.handleCallback(Handler.java:739) .java:95)在android.app.Looper.loop(Looper.java:148)的android.app.ActivityThread.main(ActivityThread.java:5417)at java.lang.reflect.Method.invoke(Native Method)at atcom.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我试过了

Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();

代替

Class.forName("com.ibm.db2.jcc.DB2Driver");

太 .

有没有办法让JDBC-db2Driver在Android上运行?刚发现This stackoverflow问题告诉我,你无法使用android连接到bluemix-db2-server . 这是正确的吗?或者有没有办法修复NoClassDefFoundError?

谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值